{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Part 1: Filtering of books and German Literature\n",
    "This part filters all books (no e-books, no periodicals) of German Literature from 120GB of MARC21-data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import glob\n",
    "import os\n",
    "cwd = os.getcwd()\n",
    "print(cwd)\n",
    "\n",
    "files_auto = list(glob.glob(os.path.join('/usr/users/gittel1/jupyterhub-gwdg/GBV' , '*.mrc')))\n",
    "#files_auto = list(glob.glob(os.path.join('C:/Temp/153' , '*.mrc')))\n",
    "print(\"Files used: \", files_auto)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pymarc import MARCReader\n",
    "from string import punctuation\n",
    "import re\n",
    "import itertools\n",
    "import pickle\n",
    "import time\n",
    "from tqdm import tqdm\n",
    "\n",
    "import spacy\n",
    "nlp = spacy.load('de_core_news_sm')\n",
    "\n",
    "import detectlanguage\n",
    "detectlanguage.configuration.api_key = \"6e7d01fd6433e3616bc110e39c74c108\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Get `author`, `title`, `date` for books."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_info(b):\n",
    "    try:\n",
    "        author = b.get_fields('100')[0]['a']\n",
    "\n",
    "    except:\n",
    "        \n",
    "        try:\n",
    "            author = b.get_fields('245')[0]['c']\n",
    "            relationship = b.get_fields('700')[0]['e']\n",
    "\n",
    "        except:\n",
    "            author = None\n",
    "            pass\n",
    "        \n",
    "    try:\n",
    "        title = b.get_fields('245')[0]['a']\n",
    "    except:\n",
    "        title = \"NOTITLE\"\n",
    "        pass\n",
    "    \n",
    "    try:\n",
    "        sub_title = b.get_fields('245')[0]['b']\n",
    "        title += '---' + sub_title\n",
    "    except:\n",
    "        sub_title = None\n",
    "        pass\n",
    "\n",
    "    try:\n",
    "        date = b.get_fields('264')[0]['c']\n",
    "        date = ''.join([c for c in date if c.isnumeric()])\n",
    "        if len(date) > 4:\n",
    "            date = date[:4]\n",
    "        date = int(date)\n",
    "        \n",
    "    except:\n",
    "        #try:\n",
    "        #date = int(b.get_fields('883')[0]['d'][:4])\n",
    "        #except:\n",
    "        date = None\n",
    "            \n",
    "    try:\n",
    "        genre_values1 = record.get_fields('084')\n",
    "        genre_values2 = record.get_fields('083')\n",
    "        genre_values3 = record.get_fields('082')\n",
    "        gvs_sifted = []\n",
    "        for v in itertools.chain(genre_values1, genre_values2, genre_values3):\n",
    "            gvs_sifted.extend(v.value().split())\n",
    "    except:\n",
    "        gvs_sifted = None\n",
    "        pass\n",
    "    \n",
    "    try:\n",
    "        edition = b.get_fields('250')[0]['a']\n",
    "    except:\n",
    "        edition = None\n",
    "        pass\n",
    "    \n",
    "    try:\n",
    "        location = str.lower(str(b.get_fields('264')[0]['a']))\n",
    "    except:\n",
    "        location = None\n",
    "        pass\n",
    "    \n",
    "    try:\n",
    "        publishing_house = str.lower(str(b.get_fields('264')[0]['b']))\n",
    "    except:\n",
    "        publishing_house = None\n",
    "        pass\n",
    "        \n",
    "    try:\n",
    "        pages = str.lower(str(b.get_fields('300')[0]['a']))\n",
    "        number_of_pages = pages.split('s', 1)[0]\n",
    "    except:\n",
    "        number_of_pages = None\n",
    "        pass\n",
    "    \n",
    "    try:\n",
    "        genre_by_librarian = b.get_fields('655')[0]['a']\n",
    "    except:\n",
    "        genre_by_librarian = None\n",
    "        pass\n",
    "    \n",
    "    try:\n",
    "        ident = ident = b.get_fields('001')[0]\n",
    "    except:\n",
    "        ident = \"\"\n",
    "        pass\n",
    "    \n",
    "    try:\n",
    "        summary = b.get_fields('520')[0]\n",
    "    except:\n",
    "        summary = \"\"\n",
    "        pass\n",
    "\n",
    "    if sub_title is not None:\n",
    "        return {'PPN': ident,\n",
    "                'author': author,\n",
    "                'title': title,\n",
    "                'date': date,\n",
    "                'subtitle': sub_title,\n",
    "                'genre': gvs_sifted,\n",
    "                'edition': edition,\n",
    "                'location': location,\n",
    "                'publishing-house': publishing_house,\n",
    "                'pages': number_of_pages,\n",
    "                'genre-by-librarian': genre_by_librarian,\n",
    "                'summary': summary}\n",
    "    else:\n",
    "        return {'PPN': ident,\n",
    "                'author': author,\n",
    "                'title': title,\n",
    "                'date': date,\n",
    "                'genre': gvs_sifted,\n",
    "                'edition': edition,\n",
    "                'location': location,\n",
    "                'publishing-house': publishing_house,\n",
    "                'pages': number_of_pages,\n",
    "                'genre-by-librarian': genre_by_librarian,\n",
    "                'summary': summary}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def print_info(b):\n",
    "    try:\n",
    "        author = b.get_fields('100')[0]['a']\n",
    "        title = b.get_fields('245')[0]['a']\n",
    "        year = b.get_fields('264')[0]['c']\n",
    "        ident = b.get_fields('001')[0]\n",
    "        print(\"AUTOR: \", author, \": \", title, \" JAHR: \", year, \"PPN: \", ident)\n",
    "    except:\n",
    "        try:\n",
    "            author = b.get_fields('100')[0]['a']\n",
    "            title = b.get_fields('245')[0]['a']\n",
    "            ident = b.get_fields('001')[0]\n",
    "            print(\"AUTOR: \",author, \": \", title, \"PPN: \", ident)\n",
    "        except:\n",
    "            pass\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Definition of subject groups (\"Sachgruppen\")\n",
    "This section defines the codes used by the 430 libraries that are part of the GBV-library-network.\n",
    "It also defines negative criteria that help to distingish literature from works of literary criticism."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#ddc = {\"830\", \"831\", \"832\", \"833\", \"834\", \"835\", \"836\", \"837\", \"838\"} # nach ddc allein keine Unterscheidung zwischen Primär- und Sekundärlit. möglich\n",
    "asb = {\"Za\", \"Zaa\", \"Zab\", \"Zb\", \"Zba\", \"Zba 1\", \"Zbb\", \"Zbc\", \"Zbf\", \"Zc\", \"Zd\", \"Zda\", \"Zdb\", \"Zdc\", \"Zdx\", \"Zf\", \"Zm\"}\n",
    "duisburg = {\"ZAA\", \"ZAB\", \"ZAC\", \"ZAD\", \"ZAE\",\"ZAF\", \"ZAG\", \"ZAH\", \"ZAK\", \"ZAL\", \"ZAM\", \"ZAN\", \"ZAR\"}\n",
    "sfb = {\"LIT 205\",\"LIT 207\", \"LIT 210\", \"LIT 212\", \"LIT 214\", \"LIT 222\", \"LIT 259\", \"LIT 267\", \"LIT 273\", \"LIT 275\", \"LIT 280\"} # nur einzelne Autoren, theoretisch noch mehr relevante Codes\n",
    "kab = {\"R 0\", \"R 01\", \"R 02\", \"R 1\", 'R 11', 'R 12', 'R 13', 'R 14', 'R 15', 'R 16', 'R 17', 'R 18', 'R 19', \"R2\", \"R3\", 'R 30', 'R 31', 'R 32', 'R 33', 'R 34', 'R 35', 'R 36', 'R 37', 'R 38', 'R 39', \"R 5\", \"R 50\", \"R 7\", \"R 70\"}\n",
    "#nummern = range(881,4898)\n",
    "nummern = []\n",
    "codes_loc = itertools.chain(range(881,1902), range(1910, 4898))\n",
    "for x in codes_loc:\n",
    "    nummern.append(x)\n",
    "loc = {'PT%s' % s for s in nummern}\n",
    "## experimentell Basisklassifikation\n",
    "basiskl = {\"18.10\"} # Feld 689\n",
    "schlagwort1 = [x.lower() for x in [\"Anthologie\", \"Autobiografie\", \"Autobiographie\", \"Biografie\", \"Biographie\", \"Fiktionale\", \"Fiktion\", \"Hörspiel\", \"Reisebericht\", \"Theaterstück\", \"literatur\", \"roman\", \"belletristik\", \"belletristische\"]] # Feld 655\n",
    "# Regensburger Verbundklassifikation\n",
    "rvk1 = [\"Deutsche Literatur\", \"Einzelne Autoren\", \"Einzelausgaben\"]\n",
    "rvk2 = [\"Deutsche Literatur\", \"Einzelne Autoren\", \"Gesamtausgaben\"]\n",
    "rvk3 = [\"Deutsche Literatur\", \"Einzelne Autoren\", \"Primärliteratur\"]\n",
    "alteDrucke = set([x.lower() for x in [\"fiktionale\", \"fiktion\", \"belletristische\", \"Almanach\", \"anekdote\", \"anthologie\", \"aphorismus\", \"ballade\", \"drama\", \"elegie\", \"Emblembuch\", \"Epigramm\", \"Epik\", \"Epikedeion\", \"Epos\", \"Erbauungsliteratur\", \"Erlebnisbericht\", \"Erotische Literatur\", \"Erzählung\", \"Fabel\", \"Fastnachtsspiel\", \"Figurengedicht\", \"Frauenliteratur\", \"Freimaurerliteratur\", \"Jesuitendrama\", \"Kolportageliteratur\", \"Komödie\", \"Legende\", \"Lyrik\", \"Märchen\", \"Novelle\", \"Panegyrikos\", \"Reisebericht\", \"Roman\", \"Sage\", \"Satire\", \"Schauspiel\", \"Schwank\", \"Schäferdichtung\", \"Totentanz\", \"Tragödie\", \"Trivialliteratur\", \"Verserzählung\", \"Volksbuch\" ]])\n",
    "\n",
    "# Ausschlusskriterien\n",
    "nummern2 = [\"{0:02}\".format(i) for i in range(97)]\n",
    "nummern2.append(\"99\")\n",
    "soll_nicht_basiskl = {'17.%s' % s for s in nummern2}\n",
    "#soll_nicht_655 = [\"lehrbuch\", \"zitatensammlung\", \"lehrerhandbuch\", \"zeittafel\", \"fachkunde\", \"katalog\", \"norm\", \"anleitung\", \"vorlesungsverzeichnis\", \"bildband\", \"schulbuch\", \"wörterbuch\", \"beispielsammlung\", \"lehrmittel\", \"briefsammlung\", \"umfrage\", \"kommentar\", \"quelle\", \"aufsatzsammlung\", \"ausstellungskatalog\", \"hochschulschrift\", \"forschungsbericht\", \"konferenzschrift\", \"statistik\", \"einführung\", \"werkverzeichnis\", \"bibliografie\", \"führer\", \"literaturbericht\", \"verzeichnis\", \"festschrift\"] # Schlagwort (Feld 655 soll nicht enthalten)\n",
    "soll_nicht_245 = set([\"abhandlungen\", \"studien\", \"untersuchung\", \"wissenschaftlich\", \"analyse\", \"aufsätze\"])\n",
    "pattern245 = re.compile(r'(=|([^\\s]+)bers\\.|([^\\s]+)bersetzt|([^\\s]+)bersetzung|([^\\s]+)bertr\\.|([^\\s]+)bertragen|([^\\s]+)bertragung)|[Tr]ansl|[Tr]aduz|[Tr]aduc|[Tt]raduit|[Tt]radot|[Tt]rad.|[Oo]versat|[Pp]ereved|([^\\s]+)versatt|[Pp]erekl|[Pp]rzet([^\\s]+)umacz|p([^\\s]+)elo([^\\s]+)eno|[Pp]reved|[Pp]rze([^\\s]+).|[Pp]rze([^\\s]+)o([^\\s]+)y([^\\s]+)|[Oo]versat|[Kk]([^\\s]+)([^\\s]+)nnet|[Pp]rev|[Ll]eford([^\\s]+)tott|[Pp]erev|[Pp]rzek([^\\s]+)ad|[Tt]olkning')\n",
    "pattern245_2 = re.compile(r'([Hh]ochdt]|[Hh]ochdeutsch|[Nn]hd.|[Nn]euhochdeutsch|[Nn]euhochdt)|[Mm]ittelhochd|[Mm]hd.')\n",
    "pattern500a = re.compile(r'([Tt]eilaus]|[Aa]usz)')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "rvk = \"\"\"GE 9390\n",
    "GE 9391\n",
    "GE 9395\n",
    "GE 9396\n",
    "GE 9400\n",
    "GE 9401\n",
    "GE 9405\n",
    "GE 9406\n",
    "GE 9410\n",
    "GE 9411\n",
    "GE 9415\n",
    "GE 9416\n",
    "GE 9420\n",
    "GE 9421\n",
    "GE 9425\n",
    "GE 9426\n",
    "GE 9430\n",
    "GE 9431\n",
    "GE 9435\n",
    "GE 9436\n",
    "GE 9450\n",
    "GE 9451\n",
    "GE 9455\n",
    "GE 9456\n",
    "GE 9465\n",
    "GE 9466\n",
    "GE 9470\n",
    "GE 9471\n",
    "GE 9475\n",
    "GE 9476\n",
    "GE 9490\n",
    "GE 9491\n",
    "GE 9495\n",
    "GE 9496\n",
    "GE 9790\n",
    "GE 9791\n",
    "GE 9801\n",
    "GE 9802\n",
    "GF 1805\n",
    "GF 1806\n",
    "GF 1820\n",
    "GF 1821\n",
    "GF 1830\n",
    "GF 1831\n",
    "GF 1840\n",
    "GF 1841\n",
    "GF 1850\n",
    "GF 1851\n",
    "GF 1860\n",
    "GF 1861\n",
    "GF 1870\n",
    "GF 1871\n",
    "GF 1880\n",
    "GF 1881\n",
    "GF 1885\n",
    "GF 1886\n",
    "GF 1895\n",
    "GF 1896\n",
    "GF 1900\n",
    "GF 1901\n",
    "GF 1910\n",
    "GF 1911\n",
    "GF 1920\n",
    "GF 1921\n",
    "GF 1925\n",
    "GF 1926\n",
    "GF 1930\n",
    "GF 1931\n",
    "GF 1935\n",
    "GF 1936\n",
    "GF 1945\n",
    "GF 1946\n",
    "GF 1955\n",
    "GF 1956\n",
    "GF 1960\n",
    "GF 1961\n",
    "GF 1965\n",
    "GF 1966\n",
    "GF 1975\n",
    "GF 1976\n",
    "GF 1985\n",
    "GF 1986\n",
    "GF 1995\n",
    "GF 1996\n",
    "GF 2000\n",
    "GF 2001\n",
    "GF 2010\n",
    "GF 2011\n",
    "GF 2020\n",
    "GF 2021\n",
    "GF 2030\n",
    "GF 2031\n",
    "GF 2040\n",
    "GF 2041\n",
    "GF 2050\n",
    "GF 2051\n",
    "GF 2054\n",
    "GF 2055\n",
    "GF 2061\n",
    "GF 2062\n",
    "GF 2070\n",
    "GF 2071\n",
    "GF 2080\n",
    "GF 2081\n",
    "GF 2090\n",
    "GF 2091\n",
    "GF 2110\n",
    "GF 2111\n",
    "GF 2120\n",
    "GF 2121\n",
    "GF 2130\n",
    "GF 2131\n",
    "GF 2140\n",
    "GF 2141\n",
    "GF 2150\n",
    "GF 2151\n",
    "GF 2160\n",
    "GF 2161\n",
    "GF 2170\n",
    "GF 2171\n",
    "GF 2180\n",
    "GF 2181\n",
    "GF 2200\n",
    "GF 2201\n",
    "GF 2210\n",
    "GF 2211\n",
    "GF 2220\n",
    "GF 2221\n",
    "GF 2225\n",
    "GF 2226\n",
    "GF 2230\n",
    "GF 2231\n",
    "GF 2240\n",
    "GF 2241\n",
    "GF 2250\n",
    "GF 2251\n",
    "GF 2260\n",
    "GF 2261\n",
    "GF 2270\n",
    "GF 2271\n",
    "GF 2280\n",
    "GF 2281\n",
    "GF 2290\n",
    "GF 2291\n",
    "GF 2300\n",
    "GF 2301\n",
    "GF 2305\n",
    "GF 2305-GF 2308\n",
    "GF 2305-GF 2319\n",
    "GF 2306\n",
    "GF 2310\n",
    "GF 2312\n",
    "GF 2314\n",
    "GF 2316\n",
    "GF 2318\n",
    "GF 2320\n",
    "GF 2321\n",
    "GF 2325\n",
    "GF 2326\n",
    "GF 2330\n",
    "GF 2331\n",
    "GF 2340\n",
    "GF 2341\n",
    "GF 2350\n",
    "GF 2351\n",
    "GF 2360\n",
    "GF 2361\n",
    "GF 2370\n",
    "GF 2371\n",
    "GF 2380\n",
    "GF 2381\n",
    "GF 2390\n",
    "GF 2391\n",
    "GF 2400\n",
    "GF 2401\n",
    "GF 2405\n",
    "GF 2406\n",
    "GF 2410\n",
    "GF 2411\n",
    "GF 2420\n",
    "GF 2421\n",
    "GF 2430\n",
    "GF 2431\n",
    "GF 2440\n",
    "GF 2441\n",
    "GF 2450\n",
    "GF 2451\n",
    "GF 2470\n",
    "GF 2471\n",
    "GF 3367\n",
    "GF 3368\n",
    "GF 3375\n",
    "GF 3376\n",
    "GF 3399\n",
    "GF 3400\n",
    "GF 3421\n",
    "GF 3422\n",
    "GF 3512\n",
    "GF 3513\n",
    "GF 3524\n",
    "GF 3525\n",
    "GF 3572\n",
    "GF 3603\n",
    "GF 3604\n",
    "GF 3630\n",
    "GF 3631\n",
    "GF 3652\n",
    "GF 3653\n",
    "GF 3699\n",
    "GF 3700\n",
    "GF 3712\n",
    "GF 3713\n",
    "GF 3749\n",
    "GF 3750\n",
    "GF 3780\n",
    "GF 3781\n",
    "GF 3794\n",
    "GF 3795\n",
    "GF 3812\n",
    "GF 3813\n",
    "GF 3835\n",
    "GF 3836\n",
    "GF 3841\n",
    "GF 3842\n",
    "GF 3850\n",
    "GF 3851\n",
    "GF 3860\n",
    "GF 3861\n",
    "GF 3888\n",
    "GF 3889\n",
    "GF 3895\n",
    "GF 3896\n",
    "GF 3900\n",
    "GF 3901\n",
    "GF 3937\n",
    "GF 3938\n",
    "GF 3960\n",
    "GF 3961\n",
    "GF 3980\n",
    "GF 3981\n",
    "GF 3991\n",
    "GF 3992\n",
    "GF 3996\n",
    "GF 3997\n",
    "GF 4010\n",
    "GF 4020\n",
    "GF 4021\n",
    "GF 4032\n",
    "GF 4033\n",
    "GF 4044\n",
    "GF 4045\n",
    "GF 4110\n",
    "GF 4111\n",
    "GF 4120\n",
    "GF 4121\n",
    "GF 4247\n",
    "GF 4248\n",
    "GF 4293\n",
    "GF 4294\n",
    "GF 4339\n",
    "GF 4340\n",
    "GF 4395\n",
    "GF 4396\n",
    "GF 4433\n",
    "GF 4434\n",
    "GF 4445\n",
    "GF 4446\n",
    "GF 4479\n",
    "GF 4480\n",
    "GF 4486\n",
    "GF 4487\n",
    "GF 4500\n",
    "GF 4501\n",
    "GF 4505\n",
    "GF 4506\n",
    "GF 4572\n",
    "GF 4573\n",
    "GF 4590\n",
    "GF 4591\n",
    "GF 4595\n",
    "GF 4596\n",
    "GF 4610\n",
    "GF 4611\n",
    "GF 4664\n",
    "GF 4665\n",
    "GF 4672\n",
    "GF 4673\n",
    "GF 4680\n",
    "GF 4681\n",
    "GF 4690\n",
    "GF 4691\n",
    "GF 4712\n",
    "GF 4713\n",
    "GF 4840\n",
    "GF 4841\n",
    "GF 4865\n",
    "GF 4866\n",
    "GF 4870\n",
    "GF 4871\n",
    "GF 4880\n",
    "GF 4881\n",
    "GF 4885\n",
    "GF 4886\n",
    "GF 4890\n",
    "GF 4891\n",
    "GF 4912\n",
    "GF 4913\n",
    "GF 4930\n",
    "GF 4931\n",
    "GF 4957\n",
    "GF 4958\n",
    "GF 4963\n",
    "GF 4991\n",
    "GF 5003\n",
    "GF 5004\n",
    "GF 5055\n",
    "GF 5056\n",
    "GF 5059\n",
    "GF 5061\n",
    "GF 5101\n",
    "GF 5102\n",
    "GF 5115\n",
    "GF 5116\n",
    "GF 5120\n",
    "GF 5123\n",
    "GF 5125\n",
    "GF 5126\n",
    "GF 5150\n",
    "GF 5151\n",
    "GF 5197\n",
    "GF 5198\n",
    "GF 5201\n",
    "GF 5202\n",
    "GF 5246\n",
    "GF 5247\n",
    "GF 5293\n",
    "GF 5294\n",
    "GF 5320\n",
    "GF 5321\n",
    "GF 5324\n",
    "GF 5341\n",
    "GF 5342\n",
    "GF 5346\n",
    "GF 5347\n",
    "GF 5386\n",
    "GF 5387\n",
    "GF 5390\n",
    "GF 5391\n",
    "GF 5394\n",
    "GF 5395\n",
    "GF 5405\n",
    "GF 5406\n",
    "GF 5415\n",
    "GF 5416\n",
    "GF 5419\n",
    "GF 5423\n",
    "GF 5427\n",
    "GF 5429\n",
    "GF 5431\n",
    "GF 5432\n",
    "GF 5477\n",
    "GF 5478\n",
    "GF 5523\n",
    "GF 5524\n",
    "GF 5529\n",
    "GF 5530\n",
    "GF 5533\n",
    "GF 5534\n",
    "GF 5537\n",
    "GF 5538\n",
    "GF 5614\n",
    "GF 5615\n",
    "GF 5618\n",
    "GF 5619\n",
    "GF 5622\n",
    "GF 5623\n",
    "GF 5661\n",
    "GF 5662\n",
    "GF 5680\n",
    "GF 5681\n",
    "GF 5706\n",
    "GF 5707\n",
    "GF 5752\n",
    "GF 5753\n",
    "GF 5799\n",
    "GF 5800\n",
    "GF 5830\n",
    "GF 5831\n",
    "GF 5840\n",
    "GF 5845\n",
    "GF 5846\n",
    "GF 5895\n",
    "GF 5896\n",
    "GF 5902\n",
    "GF 5903\n",
    "GF 5909\n",
    "GF 5910\n",
    "GF 5947\n",
    "GF 5948\n",
    "GF 5956\n",
    "GF 5957\n",
    "GF 5961\n",
    "GF 5962\n",
    "GF 5965\n",
    "GF 5966\n",
    "GF 5970\n",
    "GF 5971\n",
    "GF 5980\n",
    "GF 5981\n",
    "GF 5994\n",
    "GF 5995\n",
    "GF 6041\n",
    "GF 6042\n",
    "GF 6760\n",
    "GF 6761\n",
    "GF 6765\n",
    "GF 6766\n",
    "GF 6772\n",
    "GF 6773\n",
    "GF 6787\n",
    "GF 6788\n",
    "GF 6795\n",
    "GF 6796\n",
    "GF 6822\n",
    "GF 6823\n",
    "GF 6846\n",
    "GF 6847\n",
    "GF 6897\n",
    "GF 6898\n",
    "GF 6906\n",
    "GF 6907\n",
    "GF 6919\n",
    "GF 6920\n",
    "GF 6929\n",
    "GF 6930\n",
    "GF 6945\n",
    "GF 6946\n",
    "GF 6950\n",
    "GF 6951\n",
    "GF 6958\n",
    "GF 6959\n",
    "GF 6966\n",
    "GF 6967\n",
    "GF 6970\n",
    "GF 6971\n",
    "GF 6980\n",
    "GF 6981\n",
    "GF 6987\n",
    "GF 6989\n",
    "GF 6991\n",
    "GF 6998\n",
    "GF 6999\n",
    "GF 7020\n",
    "GF 7046\n",
    "GF 7047\n",
    "GF 7050\n",
    "GF 7051\n",
    "GF 7112\n",
    "GF 7113\n",
    "GF 7148\n",
    "GF 7149\n",
    "GF 7160\n",
    "GF 7161\n",
    "GF 7175\n",
    "GF 7176\n",
    "GF 7181\n",
    "GF 7182\n",
    "GF 7199\n",
    "GF 7200\n",
    "GF 7215\n",
    "GF 7246\n",
    "GF 7247\n",
    "GF 7260\n",
    "GF 7261\n",
    "GF 7268\n",
    "GF 7286\n",
    "GF 7290\n",
    "GF 7291\n",
    "GF 7297\n",
    "GF 7298\n",
    "GF 7302\n",
    "GF 7303\n",
    "GF 7310\n",
    "GF 7311\n",
    "GF 7320\n",
    "GF 7321\n",
    "GF 7330\n",
    "GF 7331\n",
    "GF 7335\n",
    "GF 7340\n",
    "GF 7341\n",
    "GF 7344\n",
    "GF 7345\n",
    "GF 7352\n",
    "GF 7353\n",
    "GF 7470\n",
    "GF 7471\n",
    "GF 7498\n",
    "GF 7499\n",
    "GF 7502\n",
    "GF 7503\n",
    "GF 7515\n",
    "GF 7516\n",
    "GF 7524\n",
    "GF 7525\n",
    "GF 7530\n",
    "GF 7531\n",
    "GF 7540\n",
    "GF 7541\n",
    "GF 7549\n",
    "GF 7550\n",
    "GF 7562\n",
    "GF 7588\n",
    "GF 7589\n",
    "GF 7604\n",
    "GF 7605\n",
    "GF 7610\n",
    "GF 7612\n",
    "GF 7615\n",
    "GF 7616\n",
    "GF 7655\n",
    "GF 7656\n",
    "GF 7670\n",
    "GF 7671\n",
    "GF 7674\n",
    "GF 7676\n",
    "GF 7678\n",
    "GF 7680\n",
    "GF 7681\n",
    "GF 7690\n",
    "GF 7691\n",
    "GF 7695\n",
    "GF 7696\n",
    "GF 7699\n",
    "GF 7700\n",
    "GF 7707\n",
    "GF 7708\n",
    "GF 7722\n",
    "GF 7723\n",
    "GF 7731\n",
    "GF 7732\n",
    "GF 7735\n",
    "GF 7736\n",
    "GF 7745\n",
    "GF 7746\n",
    "GF 7749\n",
    "GF 7750\n",
    "GF 7755\n",
    "GF 7756\n",
    "GF 7765\n",
    "GF 7766\n",
    "GF 7769\n",
    "GF 7771\n",
    "GF 7772\n",
    "GF 7775\n",
    "GF 7776\n",
    "GF 7779\n",
    "GF 7780\n",
    "GF 7787\n",
    "GF 7790\n",
    "GF 7791\n",
    "GF 7798\n",
    "GF 7799\n",
    "GF 7804\n",
    "GF 7808\n",
    "GF 7809\n",
    "GF 7815\n",
    "GF 7816\n",
    "GF 7820\n",
    "GF 7821\n",
    "GF 7859\n",
    "GF 7860\n",
    "GF 7865\n",
    "GF 7866\n",
    "GF 7889\n",
    "GF 7890\n",
    "GF 7901\n",
    "GF 7904\n",
    "GF 7907\n",
    "GF 7910\n",
    "GF 7912\n",
    "GF 7915\n",
    "GF 7916\n",
    "GF 7922\n",
    "GF 7923\n",
    "GF 7930\n",
    "GF 7944\n",
    "GF 7945\n",
    "GF 7952\n",
    "GF 7953\n",
    "GF 7956\n",
    "GF 7957\n",
    "GF 7960\n",
    "GF 7961\n",
    "GF 7965\n",
    "GF 7966\n",
    "GF 7970\n",
    "GF 7972\n",
    "GF 7975\n",
    "GF 8005\n",
    "GF 8054\n",
    "GF 8055\n",
    "GF 8072\n",
    "GF 8073\n",
    "GF 8076\n",
    "GF 8077\n",
    "GF 8086\n",
    "GF 8087\n",
    "GF 8090\n",
    "GF 8091\n",
    "GF 8100\n",
    "GF 8101\n",
    "GF 8108\n",
    "GF 8110\n",
    "GF 8111\n",
    "GF 8115\n",
    "GF 8116\n",
    "GF 8119\n",
    "GF 8125\n",
    "GF 8126\n",
    "GF 8135\n",
    "GF 8136\n",
    "GF 8147\n",
    "GF 8149\n",
    "GF 8150\n",
    "GF 8155\n",
    "GF 8156\n",
    "GF 8161\n",
    "GF 8162\n",
    "GF 8168\n",
    "GF 8169\n",
    "GF 8181\n",
    "GF 8182\n",
    "GF 8192\n",
    "GF 8193\n",
    "GF 8203\n",
    "GF 8205\n",
    "GF 8207\n",
    "GF 8208\n",
    "GF 8211\n",
    "GF 8225\n",
    "GF 8226\n",
    "GF 8233\n",
    "GF 8234\n",
    "GG 4965\n",
    "GG 4968\n",
    "GG 4970\n",
    "GG 4971\n",
    "GG 4980\n",
    "GG 4981\n",
    "GG 4990\n",
    "GG 4993\n",
    "GG 4995\n",
    "GG 4997\n",
    "GG 4999\n",
    "GG 5001\n",
    "GG 5002\n",
    "GG 5050\n",
    "GG 5051\n",
    "GG 5065\n",
    "GG 5066\n",
    "GG 5070\n",
    "GG 5071\n",
    "GG 5080\n",
    "GG 5081\n",
    "GG 5191\n",
    "GG 5192\n",
    "GG 5285\n",
    "GG 5286\n",
    "GG 5475\n",
    "GG 5476\n",
    "GG 5500\n",
    "GG 5501\n",
    "GG 5510\n",
    "GG 5511\n",
    "GG 5544\n",
    "GG 5545\n",
    "GG 5620\n",
    "GG 5621\n",
    "GG 5673\n",
    "GG 5675\n",
    "GG 5676\n",
    "GG 5696\n",
    "GG 5697\n",
    "GG 5700\n",
    "GG 5701\n",
    "GG 5751\n",
    "GG 5752\n",
    "GG 6001\n",
    "GG 6002\n",
    "GG 6035\n",
    "GG 6036\n",
    "GG 6040\n",
    "GG 6041\n",
    "GG 6045\n",
    "GG 6046\n",
    "GG 6055\n",
    "GG 6056\n",
    "GG 6060\n",
    "GG 6061\n",
    "GG 6070\n",
    "GG 6071\n",
    "GG 6080\n",
    "GG 6081\n",
    "GG 6110\n",
    "GG 6111\n",
    "GG 6141\n",
    "GG 6142\n",
    "GG 6146\n",
    "GG 6148\n",
    "GG 6150\n",
    "GG 6151\n",
    "GG 6209\n",
    "GG 6235\n",
    "GG 6236\n",
    "GG 6250\n",
    "GG 6251\n",
    "GG 6331\n",
    "GG 6332\n",
    "GG 6525\n",
    "GG 6527\n",
    "GG 6532\n",
    "GG 6533\n",
    "GG 6550\n",
    "GG 6551\n",
    "GG 6575\n",
    "GG 6576\n",
    "GG 6585\n",
    "GG 6586\n",
    "GG 6701\n",
    "GG 6715\n",
    "GG 6716\n",
    "GG 6730\n",
    "GG 6731\n",
    "GG 6811\n",
    "GG 6812\n",
    "GG 6899\n",
    "GG 6901\n",
    "GG 6902\n",
    "GG 6996\n",
    "GG 6997\n",
    "GG 7004\n",
    "GG 7005\n",
    "GG 7011\n",
    "GG 7012\n",
    "GG 7070\n",
    "GG 7071\n",
    "GG 7083\n",
    "GG 7084\n",
    "GG 7174\n",
    "GG 7175\n",
    "GG 7235\n",
    "GG 7236\n",
    "GG 7265\n",
    "GG 7266\n",
    "GG 7295\n",
    "GG 7296\n",
    "GG 7345\n",
    "GG 7346\n",
    "GG 7356\n",
    "GG 7357\n",
    "GG 7389\n",
    "GG 7390\n",
    "GG 7408\n",
    "GG 7409\n",
    "GG 7447\n",
    "GG 7448\n",
    "GG 7538\n",
    "GG 7539\n",
    "GG 7545\n",
    "GG 7550\n",
    "GG 7551\n",
    "GG 7629\n",
    "GG 7630\n",
    "GG 7646\n",
    "GG 7647\n",
    "GG 7721\n",
    "GG 7722\n",
    "GG 7752\n",
    "GG 7753\n",
    "GG 7765\n",
    "GG 7766\n",
    "GG 7850\n",
    "GG 7851\n",
    "GG 7915\n",
    "GG 7916\n",
    "GG 7920\n",
    "GG 7925\n",
    "GG 7926\n",
    "GG 7950\n",
    "GG 7951\n",
    "GG 7972\n",
    "GG 7973\n",
    "GG 7985\n",
    "GG 7986\n",
    "GG 7990\n",
    "GG 8020\n",
    "GG 8021\n",
    "GG 8035\n",
    "GG 8036\n",
    "GG 8040\n",
    "GG 8041\n",
    "GG 8060\n",
    "GG 8061\n",
    "GG 8064\n",
    "GG 8065\n",
    "GG 8085\n",
    "GG 8086\n",
    "GG 8096\n",
    "GG 8097\n",
    "GG 8100\n",
    "GG 8101\n",
    "GG 8105\n",
    "GG 8106\n",
    "GG 8125\n",
    "GG 8126\n",
    "GG 8150\n",
    "GG 8151\n",
    "GG 8170\n",
    "GG 8171\n",
    "GG 8195\n",
    "GG 8196\n",
    "GG 8215\n",
    "GG 8216\n",
    "GG 8304\n",
    "GG 8364\n",
    "GG 8365\n",
    "GG 8382\n",
    "GG 8383\n",
    "GG 8445\n",
    "GG 8446\n",
    "GG 8455\n",
    "GG 8457\n",
    "GG 8460\n",
    "GG 8461\n",
    "GG 8470\n",
    "GG 8471\n",
    "GG 8485\n",
    "GG 8486\n",
    "GG 8495\n",
    "GG 8496\n",
    "GG 8510\n",
    "GG 8511\n",
    "GG 8546\n",
    "GG 8547\n",
    "GG 8637\n",
    "GG 8638\n",
    "GG 8728\n",
    "GG 8729\n",
    "GG 8762\n",
    "GG 8819\n",
    "GG 8820\n",
    "GG 8844\n",
    "GG 8845\n",
    "GG 8889\n",
    "GG 8890\n",
    "GG 8911\n",
    "GG 8912\n",
    "GH 2125\n",
    "GH 2126\n",
    "GH 2135\n",
    "GH 2136\n",
    "GH 2249\n",
    "GH 2250\n",
    "GH 2375\n",
    "GH 2376\n",
    "GH 2382\n",
    "GH 2383\n",
    "GH 2499\n",
    "GH 2500\n",
    "GH 2625\n",
    "GH 2626\n",
    "GH 2749\n",
    "GH 2750\n",
    "GH 2875\n",
    "GH 2876\n",
    "GH 2999\n",
    "GH 3000\n",
    "GH 3125\n",
    "GH 3126\n",
    "GH 3134\n",
    "GH 3135\n",
    "GH 3249\n",
    "GH 3250\n",
    "GH 3375\n",
    "GH 3376\n",
    "GH 3549\n",
    "GH 3550\n",
    "GH 3625\n",
    "GH 3626\n",
    "GH 3749\n",
    "GH 3750\n",
    "GH 3763\n",
    "GH 3764\n",
    "GH 3767\n",
    "GH 3768\n",
    "GH 3875\n",
    "GH 3876\n",
    "GH 3999\n",
    "GH 4000\n",
    "GH 4125\n",
    "GH 4126\n",
    "GH 4249\n",
    "GH 4250\n",
    "GH 4375\n",
    "GH 4376\n",
    "GH 4499\n",
    "GH 4500\n",
    "GH 4560\n",
    "GH 4561\n",
    "GH 4625\n",
    "GH 4626\n",
    "GH 4749\n",
    "GH 4750\n",
    "GH 4875\n",
    "GH 4876\n",
    "GH 4999\n",
    "GH 5000\n",
    "GH 5125\n",
    "GH 5126\n",
    "GH 5249\n",
    "GH 5250\n",
    "GH 5375\n",
    "GH 5376\n",
    "GH 5499\n",
    "GH 5500\n",
    "GH 5515\n",
    "GH 5516\n",
    "GH 5626\n",
    "GH 5627\n",
    "GH 5640\n",
    "GH 5641\n",
    "GH 5749\n",
    "GH 5750\n",
    "GH 5760\n",
    "GH 5761\n",
    "GH 5766\n",
    "GH 5767\n",
    "GH 5770\n",
    "GH 5771\n",
    "GH 5827\n",
    "GH 5828\n",
    "GH 5847\n",
    "GH 5999\n",
    "GH 6000\n",
    "GH 6125\n",
    "GH 6126\n",
    "GH 6249\n",
    "GH 6250\n",
    "GH 6275\n",
    "GH 6276\n",
    "GH 6301\n",
    "GH 6382\n",
    "GH 6383\n",
    "GH 6390\n",
    "GH 6391\n",
    "GH 6499\n",
    "GH 6500\n",
    "GH 6625\n",
    "GH 6626\n",
    "GH 6680\n",
    "GH 6681\n",
    "GH 6700\n",
    "GH 6749\n",
    "GH 6750\n",
    "GH 6769\n",
    "GH 6770\n",
    "GH 6799\n",
    "GH 6875\n",
    "GH 6876\n",
    "GH 6883\n",
    "GH 6884\n",
    "GH 6999\n",
    "GH 7000\n",
    "GH 7025\n",
    "GH 7026\n",
    "GH 7050\n",
    "GH 7077\n",
    "GH 7078\n",
    "GH 7125\n",
    "GH 7126\n",
    "GH 7249\n",
    "GH 7250\n",
    "GH 7265\n",
    "GH 7266\n",
    "GH 7375\n",
    "GH 7376\n",
    "GH 7499\n",
    "GH 7500\n",
    "GH 7625\n",
    "GH 7626\n",
    "GH 7749\n",
    "GH 7750\n",
    "GH 7755\n",
    "GH 7772\n",
    "GH 7779\n",
    "GH 7799\n",
    "GH 7800\n",
    "GH 7860\n",
    "GH 7861\n",
    "GH 7875\n",
    "GH 7876\n",
    "GH 7925\n",
    "GH 7999\n",
    "GH 8000\n",
    "GH 8106\n",
    "GH 8107\n",
    "GH 8110\n",
    "GH 8111\n",
    "GH 8114\n",
    "GH 8115\n",
    "GH 8118\n",
    "GH 8119\n",
    "GH 8122\n",
    "GH 8125\n",
    "GH 8126\n",
    "GH 8137\n",
    "GH 8138\n",
    "GH 8145\n",
    "GH 8146\n",
    "GH 8157\n",
    "GH 8158\n",
    "GH 8167\n",
    "GH 8175\n",
    "GH 8176\n",
    "GH 8249\n",
    "GH 8250\n",
    "GH 8375\n",
    "GH 8376\n",
    "GH 8388\n",
    "GH 8389\n",
    "GH 8400\n",
    "GH 8401\n",
    "GH 8499\n",
    "GH 8500\n",
    "GH 8503\n",
    "GH 8504\n",
    "GH 8510\n",
    "GH 8511\n",
    "GH 8522\n",
    "GH 8523\n",
    "GH 8625\n",
    "GH 8626\n",
    "GH 8658\n",
    "GH 8690\n",
    "GH 8691\n",
    "GH 8750\n",
    "GH 8751\n",
    "GH 8759\n",
    "GH 8760\n",
    "GH 8763\n",
    "GH 8767\n",
    "GH 8768\n",
    "GH 8771\n",
    "GH 8772\n",
    "GH 8875\n",
    "GH 8876\n",
    "GH 8883\n",
    "GH 8890\n",
    "GH 8891\n",
    "GH 8897\n",
    "GH 8898\n",
    "GH 8911\n",
    "GH 8999\n",
    "GH 9000\n",
    "GH 9072\n",
    "GH 9073\n",
    "GH 9125\n",
    "GH 9126\n",
    "GH 9249\n",
    "GH 9250\n",
    "GH 9375\n",
    "GH 9376\n",
    "GH 9499\n",
    "GH 9500\n",
    "GH 9625\n",
    "GH 9626\n",
    "GH 9675\n",
    "GH 9699\n",
    "GH 9700\n",
    "GH 9775\n",
    "GH 9776\n",
    "GH 9780\n",
    "GH 9782\n",
    "GH 9783\n",
    "GH 9790\n",
    "GH 9810\n",
    "GH 9811\n",
    "GH 9816\n",
    "GH 9826\n",
    "GH 9830\n",
    "GH 9831\n",
    "GH 9849\n",
    "GH 9850\n",
    "GH 9870\n",
    "GH 9871\n",
    "GH 9880\n",
    "GH 9881\n",
    "GH 9893\n",
    "GH 9915\n",
    "GH 9916\n",
    "GH 9980\n",
    "GH 9981\n",
    "GH 9988\n",
    "GH 9989\n",
    "GI 2430\n",
    "GI 2431\n",
    "GI 2434\n",
    "GI 2444\n",
    "GI 2445\n",
    "GI 2449\n",
    "GI 2450\n",
    "GI 2453\n",
    "GI 2454\n",
    "GI 2491\n",
    "GI 2492\n",
    "GI 2584\n",
    "GI 2585\n",
    "GI 2588\n",
    "GI 2589\n",
    "GI 2594\n",
    "GI 2595\n",
    "GI 2650\n",
    "GI 2651\n",
    "GI 2735\n",
    "GI 2736\n",
    "GI 2851\n",
    "GI 2852\n",
    "GI 3037\n",
    "GI 3038\n",
    "GI 3188\n",
    "GI 3189\n",
    "GI 3230\n",
    "GI 3231\n",
    "GI 3265\n",
    "GI 3266\n",
    "GI 3310\n",
    "GI 3311\n",
    "GI 3320\n",
    "GI 3321\n",
    "GI 3350\n",
    "GI 3351\n",
    "GI 3380\n",
    "GI 3381\n",
    "GI 3390\n",
    "GI 3391\n",
    "GI 3410\n",
    "GI 3411\n",
    "GI 3430\n",
    "GI 3431\n",
    "GI 3470\n",
    "GI 3471\n",
    "GI 3490\n",
    "GI 3491\n",
    "GI 3504\n",
    "GI 3510\n",
    "GI 3511\n",
    "GI 3525\n",
    "GI 3526\n",
    "GI 3550\n",
    "GI 3551\n",
    "GI 3560\n",
    "GI 3590\n",
    "GI 3591\n",
    "GI 3625\n",
    "GI 3626\n",
    "GI 3643\n",
    "GI 3644\n",
    "GI 3690\n",
    "GI 3691\n",
    "GI 3710\n",
    "GI 3711\n",
    "GI 3740\n",
    "GI 3741\n",
    "GI 3794\n",
    "GI 3795\n",
    "GI 3850\n",
    "GI 3851\n",
    "GI 3945\n",
    "GI 3946\n",
    "GI 4250\n",
    "GI 4251\n",
    "GI 4320\n",
    "GI 4321\n",
    "GI 4347\n",
    "GI 4348\n",
    "GI 4440\n",
    "GI 4441\n",
    "GI 4784\n",
    "GI 4785\n",
    "GI 4801\n",
    "GI 4802\n",
    "GI 4952\n",
    "GI 4953\n",
    "GI 4990\n",
    "GI 4991\n",
    "GI 5060\n",
    "GI 5061\n",
    "GI 5070\n",
    "GI 5103\n",
    "GI 5104\n",
    "GI 5254\n",
    "GI 5255\n",
    "GI 5340\n",
    "GI 5341\n",
    "GI 5360\n",
    "GI 5361\n",
    "GI 5375\n",
    "GI 5376\n",
    "GI 5380\n",
    "GI 5381\n",
    "GI 5385\n",
    "GI 5386\n",
    "GI 5390\n",
    "GI 5391\n",
    "GI 5405\n",
    "GI 5406\n",
    "GI 5707\n",
    "GI 5708\n",
    "GI 5721\n",
    "GI 5722\n",
    "GI 5790\n",
    "GI 5830\n",
    "GI 5860\n",
    "GI 5861\n",
    "GI 5910\n",
    "GI 5911\n",
    "GI 6009\n",
    "GI 6010\n",
    "GI 6100\n",
    "GI 6101\n",
    "GI 6110\n",
    "GI 6111\n",
    "GI 6151\n",
    "GI 6152\n",
    "GI 6170\n",
    "GI 6171\n",
    "GI 6180\n",
    "GI 6181\n",
    "GI 6195\n",
    "GI 6196\n",
    "GI 6240\n",
    "GI 6241\n",
    "GI 6270\n",
    "GI 6271\n",
    "GI 6290\n",
    "GI 6291\n",
    "GI 6302\n",
    "GI 6303\n",
    "GI 6350\n",
    "GI 6351\n",
    "GI 6453\n",
    "GI 6454\n",
    "GI 6604\n",
    "GI 6605\n",
    "GI 6650\n",
    "GI 6651\n",
    "GI 6705\n",
    "GI 6706\n",
    "GI 6906\n",
    "GI 6907\n",
    "GI 6910\n",
    "GI 6911\n",
    "GI 6980\n",
    "GI 6981\n",
    "GI 7020\n",
    "GI 7021\n",
    "GI 7028\n",
    "GI 7029\n",
    "GI 7057\n",
    "GI 7058\n",
    "GI 7090\n",
    "GI 7091\n",
    "GI 7170\n",
    "GI 7171\n",
    "GI 7180\n",
    "GI 7181\n",
    "GI 7215\n",
    "GI 7216\n",
    "GI 7268\n",
    "GI 7269\n",
    "GI 7308\n",
    "GI 7309\n",
    "GI 7459\n",
    "GI 7460\n",
    "GI 7601\n",
    "GI 7602\n",
    "GI 7613\n",
    "GI 7614\n",
    "GI 7620\n",
    "GI 7621\n",
    "GI 7660\n",
    "GI 7661\n",
    "GI 7752\n",
    "GI 7753\n",
    "GI 7760\n",
    "GI 7761\n",
    "GI 7830\n",
    "GI 7885\n",
    "GI 7886\n",
    "GI 7903\n",
    "GI 7904\n",
    "GI 8054\n",
    "GI 8055\n",
    "GI 8103\n",
    "GI 8104\n",
    "GI 8205\n",
    "GI 8206\n",
    "GI 8268\n",
    "GI 8269\n",
    "GI 8310\n",
    "GI 8311\n",
    "GI 8560\n",
    "GI 8570\n",
    "GI 8571\n",
    "GI 8605\n",
    "GI 8606\n",
    "GI 8644\n",
    "GI 8645\n",
    "GI 8658\n",
    "GI 8659\n",
    "GI 8670\n",
    "GI 8671\n",
    "GI 8690\n",
    "GI 8691\n",
    "GI 8697\n",
    "GI 8699\n",
    "GI 8700\n",
    "GI 8703\n",
    "GI 8704\n",
    "GI 8709\n",
    "GI 8710\n",
    "GI 8851\n",
    "GI 8852\n",
    "GI 8864\n",
    "GI 8865\n",
    "GI 8881\n",
    "GI 8882\n",
    "GI 9009\n",
    "GI 9010\n",
    "GI 9304\n",
    "GI 9305\n",
    "GI 9350\n",
    "GI 9351\n",
    "GI 9455\n",
    "GI 9456\n",
    "GI 9606\n",
    "GI 9607\n",
    "GI 9624\n",
    "GI 9625\n",
    "GI 9650\n",
    "GI 9651\n",
    "GI 9800\n",
    "GI 9801\n",
    "GK 3011\n",
    "GK 3012\n",
    "GK 3016\n",
    "GK 3017\n",
    "GK 3021\n",
    "GK 3022\n",
    "GK 3026\n",
    "GK 3027\n",
    "GK 3031\n",
    "GK 3032\n",
    "GK 3036\n",
    "GK 3037\n",
    "GK 3041\n",
    "GK 3042\n",
    "GK 3062\n",
    "GK 3063\n",
    "GK 3066\n",
    "GK 3067\n",
    "GK 3071\n",
    "GK 3072\n",
    "GK 3075\n",
    "GK 3077\n",
    "GK 3078\n",
    "GK 3083\n",
    "GK 3084\n",
    "GK 3089\n",
    "GK 3090\n",
    "GK 3095\n",
    "GK 3097\n",
    "GK 3099\n",
    "GK 3105\n",
    "GK 3106\n",
    "GK 3110\n",
    "GK 3113\n",
    "GK 3114\n",
    "GK 3131\n",
    "GK 3132\n",
    "GK 3138\n",
    "GK 3139\n",
    "GK 3145\n",
    "GK 3146\n",
    "GK 3152\n",
    "GK 3157\n",
    "GK 3158\n",
    "GK 3166\n",
    "GK 3167\n",
    "GK 3183\n",
    "GK 3184\n",
    "GK 3192\n",
    "GK 3193\n",
    "GK 3200\n",
    "GK 3201\n",
    "GK 3208\n",
    "GK 3209\n",
    "GK 3216\n",
    "GK 3217\n",
    "GK 3224\n",
    "GK 3225\n",
    "GK 3234\n",
    "GK 3235\n",
    "GK 3248\n",
    "GK 3249\n",
    "GK 3255\n",
    "GK 3256\n",
    "GK 3262\n",
    "GK 3264\n",
    "GK 3266\n",
    "GK 3268\n",
    "GK 3270\n",
    "GK 3272\n",
    "GK 3273\n",
    "GK 3278\n",
    "GK 3279\n",
    "GK 3285\n",
    "GK 3286\n",
    "GK 3292\n",
    "GK 3293\n",
    "GK 3299\n",
    "GK 3300\n",
    "GK 3307\n",
    "GK 3308\n",
    "GK 3324\n",
    "GK 3328\n",
    "GK 3329\n",
    "GK 3336\n",
    "GK 3337\n",
    "GK 3352\n",
    "GK 3353\n",
    "GK 3356\n",
    "GK 3358\n",
    "GK 3360\n",
    "GK 3363\n",
    "GK 3364\n",
    "GK 3368\n",
    "GK 3369\n",
    "GK 3372\n",
    "GK 3373\n",
    "GK 3432\n",
    "GK 3433\n",
    "GK 3438\n",
    "GK 3439\n",
    "GK 3442\n",
    "GK 3443\n",
    "GK 3446\n",
    "GK 3447\n",
    "GK 3451\n",
    "GK 3453\n",
    "GK 3454\n",
    "GK 3459\n",
    "GK 3460\n",
    "GK 3464\n",
    "GK 3465\n",
    "GK 3501\n",
    "GK 3501\n",
    "GK 3501-GK 3993\n",
    "GK 3600\n",
    "GK 3600-GK 3750\n",
    "GK 3700\n",
    "GK 3750\n",
    "GK 3801\n",
    "GK 3801-GK 3993\n",
    "GK 3831\n",
    "GK 3861\n",
    "GK 3891\n",
    "GK 3921\n",
    "GK 3925\n",
    "GK 3931\n",
    "GK 3936\n",
    "GK 3941\n",
    "GK 3951\n",
    "GK 3981\n",
    "GK 3981\n",
    "GK 3981-GK 3983\n",
    "GK 3983\n",
    "GK 3989\n",
    "GK 3991\n",
    "GK 4740\n",
    "GK 4741\n",
    "GK 4745\n",
    "GK 4746\n",
    "GK 4750\n",
    "GK 4751\n",
    "GK 4758\n",
    "GK 4760\n",
    "GK 4761\n",
    "GK 4765\n",
    "GK 4766\n",
    "GK 4770\n",
    "GK 4771\n",
    "GK 4775\n",
    "GK 4776\n",
    "GK 4800\n",
    "GK 4801\n",
    "GK 4810\n",
    "GK 4811\n",
    "GK 4825\n",
    "GK 4826\n",
    "GK 4829\n",
    "GK 4830\n",
    "GK 4840\n",
    "GK 4841\n",
    "GK 4855\n",
    "GK 4856\n",
    "GK 4860\n",
    "GK 4861\n",
    "GK 4875\n",
    "GK 4876\n",
    "GK 4885\n",
    "GK 4886\n",
    "GK 4895\n",
    "GK 4896\n",
    "GK 4905\n",
    "GK 4906\n",
    "GK 4910\n",
    "GK 4911\n",
    "GK 4915\n",
    "GK 4916\n",
    "GK 4920\n",
    "GK 4921\n",
    "GK 4928\n",
    "GK 4929\n",
    "GK 4941\n",
    "GK 4942\n",
    "GK 4945\n",
    "GK 4946\n",
    "GK 4950\n",
    "GK 4951\n",
    "GK 4955\n",
    "GK 4956\n",
    "GK 4969\n",
    "GK 4970\n",
    "GK 4975\n",
    "GK 4976\n",
    "GK 4981\n",
    "GK 4982\n",
    "GK 4986\n",
    "GK 4987\n",
    "GK 4991\n",
    "GK 4992\n",
    "GK 4996\n",
    "GK 4997\n",
    "GK 5000\n",
    "GK 5001\n",
    "GK 5010\n",
    "GK 5011\n",
    "GK 5020\n",
    "GK 5021\n",
    "GK 5140\n",
    "GK 5141\n",
    "GK 5145\n",
    "GK 5146\n",
    "GK 5150\n",
    "GK 5151\n",
    "GK 5155\n",
    "GK 5156\n",
    "GK 5161\n",
    "GK 5162\n",
    "GK 5168\n",
    "GK 5169\n",
    "GK 5172\n",
    "GK 5173\n",
    "GK 5177\n",
    "GK 5178\n",
    "GK 5181\n",
    "GK 5182\n",
    "GK 5185\n",
    "GK 5187\n",
    "GK 5188\n",
    "GK 5192\n",
    "GK 5193\n",
    "GK 5203\n",
    "GK 5204\n",
    "GK 5213\n",
    "GK 5214\n",
    "GK 5218\n",
    "GK 5219\n",
    "GK 5223\n",
    "GK 5224\n",
    "GK 5228\n",
    "GK 5229\n",
    "GK 5233\n",
    "GK 5234\n",
    "GK 5238\n",
    "GK 5239\n",
    "GK 5243\n",
    "GK 5244\n",
    "GK 5248\n",
    "GK 5249\n",
    "GK 5253\n",
    "GK 5254\n",
    "GK 5261\n",
    "GK 5262\n",
    "GK 5271\n",
    "GK 5272\n",
    "GK 5277\n",
    "GK 5278\n",
    "GK 5285\n",
    "GK 5286\n",
    "GK 5295\n",
    "GK 5296\n",
    "GK 5311\n",
    "GK 5312\n",
    "GK 5317\n",
    "GK 5318\n",
    "GK 5329\n",
    "GK 5330\n",
    "GK 5340\n",
    "GK 5341\n",
    "GK 5345\n",
    "GK 5346\n",
    "GK 5350\n",
    "GK 5351\n",
    "GK 5355\n",
    "GK 5356\n",
    "GK 5360\n",
    "GK 5361\n",
    "GK 5365\n",
    "GK 5366\n",
    "GK 5370\n",
    "GK 5371\n",
    "GK 5375\n",
    "GK 5376\n",
    "GK 5380\n",
    "GK 5381\n",
    "GK 5481\n",
    "GK 5482\n",
    "GK 5510\n",
    "GK 5511\n",
    "GK 5520\n",
    "GK 5521\n",
    "GK 5530\n",
    "GK 5531\n",
    "GK 5580\n",
    "GK 5581\n",
    "GK 5600\n",
    "GK 5601\n",
    "GK 5801\n",
    "GK 5802\n",
    "GK 5850\n",
    "GK 5851\n",
    "GK 6000\n",
    "GK 6001\n",
    "GK 6155\n",
    "GK 6156\n",
    "GK 6506\n",
    "GK 6507\n",
    "GK 6516\n",
    "GK 6517\n",
    "GK 6522\n",
    "GK 6523\n",
    "GK 6526\n",
    "GK 6527\n",
    "GK 6536\n",
    "GK 6537\n",
    "GK 6546\n",
    "GK 6547\n",
    "GK 6550\n",
    "GK 6551\n",
    "GK 6556\n",
    "GK 6557\n",
    "GK 6566\n",
    "GK 6567\n",
    "GK 6576\n",
    "GK 6577\n",
    "GK 6586\n",
    "GK 6587\n",
    "GK 6596\n",
    "GK 6597\n",
    "GK 6606\n",
    "GK 6607\n",
    "GK 7006\n",
    "GK 7007\n",
    "GK 7011\n",
    "GK 7012\n",
    "GK 7017\n",
    "GK 7018\n",
    "GK 7023\n",
    "GK 7024\n",
    "GK 7028\n",
    "GK 7029\n",
    "GK 7100\n",
    "GK 7101\n",
    "GK 7110\n",
    "GK 7111\n",
    "GK 7120\n",
    "GK 7121\n",
    "GK 7130\n",
    "GK 7131\n",
    "GK 7140\n",
    "GK 7141\n",
    "GK 7150\n",
    "GK 7151\n",
    "GK 7160\n",
    "GK 7161\n",
    "GK 7170\n",
    "GK 7171\n",
    "GK 7180\n",
    "GK 7181\n",
    "GK 7300\n",
    "GK 7301\n",
    "GK 7310\n",
    "GK 7311\n",
    "GK 7320\n",
    "GK 7321\n",
    "GK 7324\n",
    "GK 7330\n",
    "GK 7331\n",
    "GK 7340\n",
    "GK 7341\n",
    "GK 7350\n",
    "GK 7351\n",
    "GK 7360\n",
    "GK 7361\n",
    "GK 7408\n",
    "GK 7409\n",
    "GK 7420\n",
    "GK 7421\n",
    "GK 7450\n",
    "GK 7451\n",
    "GK 7480\n",
    "GK 7481\n",
    "GK 7510\n",
    "GK 7511\n",
    "GK 7540\n",
    "GK 7541\n",
    "GK 7560\n",
    "GK 7561\n",
    "GK 7590\n",
    "GK 7591\n",
    "GK 7600\n",
    "GK 7601\n",
    "GK 7609\n",
    "GK 7610\n",
    "GK 7613\n",
    "GK 7630\n",
    "GK 7631\n",
    "GK 7640\n",
    "GK 7641\n",
    "GK 7644\n",
    "GK 7645\n",
    "GK 7650\n",
    "GK 7651\n",
    "GK 7660\n",
    "GK 7661\n",
    "GK 7663\n",
    "GK 7664\n",
    "GK 7670\n",
    "GK 7671\n",
    "GK 8000\n",
    "GK 8000-GK 8200\n",
    "GK 8000-GK 8200\n",
    "GK 8000-GK 8559\n",
    "GK 8100\n",
    "GK 8200\n",
    "GK 8331\n",
    "GK 8331-GK 8559\n",
    "GK 8361\n",
    "GK 8380\n",
    "GK 8401\n",
    "GK 8421\n",
    "GK 8451\n",
    "GK 8501\n",
    "GK 8520\n",
    "GK 8531\n",
    "GK 8531-GK 8559\n",
    "GK 8532\n",
    "GK 8533\n",
    "GK 8534\n",
    "GK 8535\n",
    "GK 8536\n",
    "GK 8537\n",
    "GK 8538\n",
    "GK 8539\n",
    "GK 8540\n",
    "GK 8541\n",
    "GK 8542\n",
    "GK 8543\n",
    "GK 8544\n",
    "GK 8545\n",
    "GK 8546\n",
    "GK 8547\n",
    "GK 8548\n",
    "GK 8549\n",
    "GK 8550\n",
    "GK 8551\n",
    "GK 8552\n",
    "GK 8553\n",
    "GK 8554\n",
    "GK 8555\n",
    "GK 8556\n",
    "GK 8557\n",
    "GK 8558\n",
    "GK 8559\n",
    "GK 9069\n",
    "GK 9071\n",
    "GK 9072\n",
    "GK 9092\n",
    "GK 9093\n",
    "GK 9098\n",
    "GK 9099\n",
    "GK 9102\n",
    "GK 9105\n",
    "GK 9106\n",
    "GK 9114\n",
    "GK 9120\n",
    "GK 9146\n",
    "GK 9156\n",
    "GK 9157\n",
    "GK 9160\n",
    "GK 9161\n",
    "GK 9170\n",
    "GK 9171\n",
    "GK 9180\n",
    "GK 9181\n",
    "GK 9189\n",
    "GK 9190\n",
    "GK 9195\n",
    "GK 9196\n",
    "GK 9200\n",
    "GK 9201\n",
    "GK 9206\n",
    "GK 9210\n",
    "GK 9211\n",
    "GK 9215\n",
    "GK 9220\n",
    "GK 9221\n",
    "GK 9230\n",
    "GK 9231\n",
    "GK 9240\n",
    "GK 9241\n",
    "GK 9248\n",
    "GK 9255\n",
    "GK 9256\n",
    "GK 9259\n",
    "GK 9260\n",
    "GK 9263\n",
    "GK 9266\n",
    "GK 9267\n",
    "GK 9270\n",
    "GK 9271\n",
    "GK 9275\n",
    "GK 9276\n",
    "GK 9280\n",
    "GK 9281\n",
    "GK 9285\n",
    "GK 9286\n",
    "GK 9290\n",
    "GK 9291\n",
    "GK 9294\n",
    "GK 9298\n",
    "GK 9300\n",
    "GK 9305\n",
    "GK 9306\n",
    "GK 9310\n",
    "GK 9311\n",
    "GK 9320\n",
    "GK 9321\n",
    "GK 9341\n",
    "GK 9342\n",
    "GK 9360\n",
    "GK 9361\n",
    "GK 9370\n",
    "GK 9371\n",
    "GK 9393\n",
    "GK 9401\n",
    "GK 9402\n",
    "GK 9465\n",
    "GK 9466\n",
    "GK 9475\n",
    "GK 9545\n",
    "GK 9546\n",
    "GK 9611\n",
    "GK 9612\n",
    "GK 9616\n",
    "GK 9617\n",
    "GK 9620\n",
    "GK 9621\n",
    "GK 9630\n",
    "GK 9631\n",
    "GK 9634\n",
    "GK 9635\n",
    "GK 9687\n",
    "GK 9688\n",
    "GK 9691\n",
    "GK 9692\n",
    "GK 9697\n",
    "GK 9698\n",
    "GK 9710\n",
    "GK 9711\n",
    "GK 9714\n",
    "GK 9715\n",
    "GK 9720\n",
    "GK 9721\n",
    "GK 9724\n",
    "GK 9725\n",
    "GK 9730\n",
    "GK 9731\n",
    "GK 9740\n",
    "GK 9741\n",
    "GK 9751\n",
    "GK 9752\n",
    "GK 9756\n",
    "GK 9757\n",
    "GK 9761\n",
    "GK 9762\n",
    "GK 9766\n",
    "GK 9767\n",
    "GK 9771\n",
    "GK 9772\n",
    "GK 9776\n",
    "GK 9777\n",
    "GK 9781\n",
    "GK 9782\n",
    "GK 9791\n",
    "GK 9792\n",
    "GK 9831\n",
    "GK 9832\n",
    "GK 9870\n",
    "GK 9871\n",
    "GK 9890\n",
    "GK 9891\n",
    "GL 2500\n",
    "GL 2501\n",
    "GL 2531\n",
    "GL 2532\n",
    "GL 2540\n",
    "GL 2541\n",
    "GL 2645\n",
    "GL 2646\n",
    "GL 2660\n",
    "GL 2661\n",
    "GL 2690\n",
    "GL 2691\n",
    "GL 2759\n",
    "GL 2760\n",
    "GL 2773\n",
    "GL 2774\n",
    "GL 2780\n",
    "GL 2781\n",
    "GL 2790\n",
    "GL 2791\n",
    "GL 2795\n",
    "GL 2801\n",
    "GL 2802\n",
    "GL 2810\n",
    "GL 2811\n",
    "GL 2820\n",
    "GL 2821\n",
    "GL 2826\n",
    "GL 2830\n",
    "GL 2831\n",
    "GL 2840\n",
    "GL 2841\n",
    "GL 2850\n",
    "GL 2851\n",
    "GL 2855\n",
    "GL 2856\n",
    "GL 2860\n",
    "GL 2861\n",
    "GL 2870\n",
    "GL 2871\n",
    "GL 2880\n",
    "GL 2881\n",
    "GL 2890\n",
    "GL 2891\n",
    "GL 2894\n",
    "GL 2900\n",
    "GL 2901\n",
    "GL 2915\n",
    "GL 2916\n",
    "GL 2934\n",
    "GL 2935\n",
    "GL 2942\n",
    "GL 2943\n",
    "GL 2950\n",
    "GL 2951\n",
    "GL 3029\n",
    "GL 3030\n",
    "GL 3037\n",
    "GL 3038\n",
    "GL 3050\n",
    "GL 3051\n",
    "GL 3143\n",
    "GL 3144\n",
    "GL 3147\n",
    "GL 3148\n",
    "GL 3155\n",
    "GL 3156\n",
    "GL 3257\n",
    "GL 3258\n",
    "GL 3261\n",
    "GL 3262\n",
    "GL 3272\n",
    "GL 3273\n",
    "GL 3280\n",
    "GL 3281\n",
    "GL 3315\n",
    "GL 3316\n",
    "GL 3371\n",
    "GL 3372\n",
    "GL 3380\n",
    "GL 3381\n",
    "GL 3390\n",
    "GL 3391\n",
    "GL 3400\n",
    "GL 3401\n",
    "GL 3410\n",
    "GL 3411\n",
    "GL 3455\n",
    "GL 3456\n",
    "GL 3485\n",
    "GL 3486\n",
    "GL 3500\n",
    "GL 3501\n",
    "GL 3530\n",
    "GL 3531\n",
    "GL 3550\n",
    "GL 3551\n",
    "GL 3580\n",
    "GL 3581\n",
    "GL 3588\n",
    "GL 3589\n",
    "GL 3597\n",
    "GL 3610\n",
    "GL 3611\n",
    "GL 3620\n",
    "GL 3621\n",
    "GL 3630\n",
    "GL 3631\n",
    "GL 3640\n",
    "GL 3641\n",
    "GL 3713\n",
    "GL 3714\n",
    "GL 3720\n",
    "GL 3721\n",
    "GL 3730\n",
    "GL 3731\n",
    "GL 3740\n",
    "GL 3741\n",
    "GL 3750\n",
    "GL 3751\n",
    "GL 3760\n",
    "GL 3761\n",
    "GL 3827\n",
    "GL 3828\n",
    "GL 3943\n",
    "GL 3944\n",
    "GL 3950\n",
    "GL 3951\n",
    "GL 3960\n",
    "GL 3961\n",
    "GL 4057\n",
    "GL 4058\n",
    "GL 4100\n",
    "GL 4101\n",
    "GL 4149\n",
    "GL 4150\n",
    "GL 4157\n",
    "GL 4158\n",
    "GL 4165\n",
    "GL 4166\n",
    "GL 4273\n",
    "GL 4274\n",
    "GL 4386\n",
    "GL 4387\n",
    "GL 4501\n",
    "GL 4502\n",
    "GL 4521\n",
    "GL 4522\n",
    "GL 4529\n",
    "GL 4530\n",
    "GL 4560\n",
    "GL 4561\n",
    "GL 4580\n",
    "GL 4581\n",
    "GL 4600\n",
    "GL 4601\n",
    "GL 4615\n",
    "GL 4616\n",
    "GL 4623\n",
    "GL 4624\n",
    "GL 4729\n",
    "GL 4730\n",
    "GL 4740\n",
    "GL 4741\n",
    "GL 4750\n",
    "GL 4751\n",
    "GL 4820\n",
    "GL 4843\n",
    "GL 4844\n",
    "GL 4850\n",
    "GL 4851\n",
    "GL 4950\n",
    "GL 4951\n",
    "GL 4959\n",
    "GL 4960\n",
    "GL 4991\n",
    "GL 4992\n",
    "GL 5031\n",
    "GL 5032\n",
    "GL 5071\n",
    "GL 5072\n",
    "GL 5100\n",
    "GL 5101\n",
    "GL 5110\n",
    "GL 5111\n",
    "GL 5140\n",
    "GL 5141\n",
    "GL 5184\n",
    "GL 5185\n",
    "GL 5200\n",
    "GL 5201\n",
    "GL 5250\n",
    "GL 5251\n",
    "GL 5270\n",
    "GL 5271\n",
    "GL 5285\n",
    "GL 5286\n",
    "GL 5301\n",
    "GL 5302\n",
    "GL 5415\n",
    "GL 5416\n",
    "GL 5450\n",
    "GL 5451\n",
    "GL 5470\n",
    "GL 5471\n",
    "GL 5492\n",
    "GL 5493\n",
    "GL 5500\n",
    "GL 5501\n",
    "GL 5520\n",
    "GL 5521\n",
    "GL 5531\n",
    "GL 5532\n",
    "GL 5540\n",
    "GL 5541\n",
    "GL 5550\n",
    "GL 5554\n",
    "GL 5759\n",
    "GL 5760\n",
    "GL 5770\n",
    "GL 5771\n",
    "GL 5780\n",
    "GL 5781\n",
    "GL 5803\n",
    "GL 5804\n",
    "GL 5807\n",
    "GL 5808\n",
    "GL 5811\n",
    "GL 5812\n",
    "GL 5815\n",
    "GL 5816\n",
    "GL 5830\n",
    "GL 5831\n",
    "GL 5850\n",
    "GL 5851\n",
    "GL 5856\n",
    "GL 5858\n",
    "GL 5864\n",
    "GL 5865\n",
    "GL 5870\n",
    "GL 5873\n",
    "GL 5875\n",
    "GL 5876\n",
    "GL 5880\n",
    "GL 5881\n",
    "GL 5885\n",
    "GL 5886\n",
    "GL 5890\n",
    "GL 5891\n",
    "GL 5895\n",
    "GL 5896\n",
    "GL 5900\n",
    "GL 5901\n",
    "GL 5905\n",
    "GL 5906\n",
    "GL 5910\n",
    "GL 5911\n",
    "GL 5915\n",
    "GL 5916\n",
    "GL 5920\n",
    "GL 5923\n",
    "GL 5925\n",
    "GL 5928\n",
    "GL 5930\n",
    "GL 5931\n",
    "GL 5935\n",
    "GL 5936\n",
    "GL 5940\n",
    "GL 5941\n",
    "GL 5945\n",
    "GL 5946\n",
    "GL 5950\n",
    "GL 5951\n",
    "GL 5979\n",
    "GL 5980\n",
    "GL 5990\n",
    "GL 5991\n",
    "GL 6083\n",
    "GL 6084\n",
    "GL 6120\n",
    "GL 6121\n",
    "GL 6196\n",
    "GL 6197\n",
    "GL 6250\n",
    "GL 6251\n",
    "GL 6301\n",
    "GL 6302\n",
    "GL 6415\n",
    "GL 6416\n",
    "GL 6420\n",
    "GL 6421\n",
    "GL 6644\n",
    "GL 6645\n",
    "GL 6650\n",
    "GL 6652\n",
    "GL 6654\n",
    "GL 6656\n",
    "GL 6657\n",
    "GL 6670\n",
    "GL 6671\n",
    "GL 6690\n",
    "GL 6740\n",
    "GL 6741\n",
    "GL 6759\n",
    "GL 6760\n",
    "GL 6765\n",
    "GL 6768\n",
    "GL 6770\n",
    "GL 6771\n",
    "GL 6775\n",
    "GL 6776\n",
    "GL 6780\n",
    "GL 6781\n",
    "GL 6785\n",
    "GL 6786\n",
    "GL 6790\n",
    "GL 6793\n",
    "GL 6794\n",
    "GL 6800\n",
    "GL 6801\n",
    "GL 6805\n",
    "GL 6807\n",
    "GL 6808\n",
    "GL 6810\n",
    "GL 6811\n",
    "GL 6815\n",
    "GL 6816\n",
    "GL 6820\n",
    "GL 6821\n",
    "GL 6876\n",
    "GL 6877\n",
    "GL 6881\n",
    "GL 6882\n",
    "GL 6886\n",
    "GL 6887\n",
    "GL 6891\n",
    "GL 6892\n",
    "GL 6901\n",
    "GL 6902\n",
    "GL 6991\n",
    "GL 6992\n",
    "GL 6996\n",
    "GL 6997\n",
    "GL 7001\n",
    "GL 7002\n",
    "GL 7006\n",
    "GL 7007\n",
    "GL 7011\n",
    "GL 7012\n",
    "GL 7016\n",
    "GL 7017\n",
    "GL 7021\n",
    "GL 7022\n",
    "GL 7026\n",
    "GL 7027\n",
    "GL 7105\n",
    "GL 7106\n",
    "GL 7110\n",
    "GL 7111\n",
    "GL 7115\n",
    "GL 7116\n",
    "GL 7125\n",
    "GL 7126\n",
    "GL 7145\n",
    "GL 7155\n",
    "GL 7156\n",
    "GL 7160\n",
    "GL 7161\n",
    "GL 7165\n",
    "GL 7166\n",
    "GL 7170\n",
    "GL 7171\n",
    "GL 7176\n",
    "GL 7180\n",
    "GL 7181\n",
    "GL 7185\n",
    "GL 7186\n",
    "GL 7190\n",
    "GL 7191\n",
    "GL 7195\n",
    "GL 7196\n",
    "GL 7219\n",
    "GL 7220\n",
    "GL 7334\n",
    "GL 7335\n",
    "GL 7340\n",
    "GL 7341\n",
    "GL 7354\n",
    "GL 7355\n",
    "GL 7360\n",
    "GL 7361\n",
    "GL 7370\n",
    "GL 7371\n",
    "GL 7380\n",
    "GL 7381\n",
    "GL 7449\n",
    "GL 7450\n",
    "GL 7460\n",
    "GL 7461\n",
    "GL 7470\n",
    "GL 7471\n",
    "GL 7564\n",
    "GL 7565\n",
    "GL 7676\n",
    "GL 7677\n",
    "GL 7685\n",
    "GL 7686\n",
    "GL 7690\n",
    "GL 7691\n",
    "GL 7695\n",
    "GL 7696\n",
    "GL 7700\n",
    "GL 7710\n",
    "GL 7711\n",
    "GL 7792\n",
    "GL 7793\n",
    "GL 8000\n",
    "GL 8006\n",
    "GL 8007\n",
    "GL 8011\n",
    "GL 8012\n",
    "GL 8050\n",
    "GL 8051\n",
    "GL 8070\n",
    "GL 8071\n",
    "GL 8090\n",
    "GL 8091\n",
    "GL 8135\n",
    "GL 8136\n",
    "GL 8235\n",
    "GL 8236\n",
    "GL 8331\n",
    "GL 8332\n",
    "GL 8340\n",
    "GL 8341\n",
    "GL 8400\n",
    "GL 8401\n",
    "GL 8410\n",
    "GL 8411\n",
    "GL 8414\n",
    "GL 8415\n",
    "GL 8420\n",
    "GL 8421\n",
    "GL 8430\n",
    "GL 8431\n",
    "GL 8440\n",
    "GL 8441\n",
    "GL 8450\n",
    "GL 8451\n",
    "GL 8460\n",
    "GL 8461\n",
    "GL 8470\n",
    "GL 8471\n",
    "GL 8546\n",
    "GL 8547\n",
    "GL 8551\n",
    "GL 8554\n",
    "GL 8556\n",
    "GL 8558\n",
    "GL 8561\n",
    "GL 8563\n",
    "GL 8564\n",
    "GL 8567\n",
    "GL 8568\n",
    "GL 8576\n",
    "GL 8577\n",
    "GL 8581\n",
    "GL 8582\n",
    "GL 8586\n",
    "GL 8587\n",
    "GL 8591\n",
    "GL 8592\n",
    "GL 8661\n",
    "GL 8662\n",
    "GL 8670\n",
    "GL 8671\n",
    "GL 8675\n",
    "GL 8676\n",
    "GL 8690\n",
    "GL 8691\n",
    "GL 8775\n",
    "GL 8776\n",
    "GL 8886\n",
    "GL 8887\n",
    "GL 8891\n",
    "GL 8892\n",
    "GL 8896\n",
    "GL 8897\n",
    "GL 8949\n",
    "GL 8950\n",
    "GL 9003\n",
    "GL 9004\n",
    "GL 9010\n",
    "GL 9011\n",
    "GL 9020\n",
    "GL 9021\n",
    "GL 9117\n",
    "GL 9118\n",
    "GL 9125\n",
    "GL 9130\n",
    "GL 9131\n",
    "GL 9135\n",
    "GL 9136\n",
    "GL 9140\n",
    "GL 9141\n",
    "GL 9229\n",
    "GL 9230\n",
    "GL 9343\n",
    "GL 9344\n",
    "GL 9350\n",
    "GL 9351\n",
    "GL 9360\n",
    "GL 9361\n",
    "GL 9380\n",
    "GL 9390\n",
    "GL 9391\n",
    "GL 9457\n",
    "GL 9458\n",
    "GL 9470\n",
    "GL 9471\n",
    "GL 9480\n",
    "GL 9481\n",
    "GL 9490\n",
    "GL 9491\n",
    "GL 9500\n",
    "GL 9501\n",
    "GL 9504\n",
    "GL 9505\n",
    "GL 9510\n",
    "GL 9511\n",
    "GL 9530\n",
    "GL 9531\n",
    "GL 9540\n",
    "GL 9541\n",
    "GL 9544\n",
    "GL 9550\n",
    "GL 9551\n",
    "GL 9560\n",
    "GL 9561\n",
    "GL 9660\n",
    "GL 9661\n",
    "GL 9680\n",
    "GL 9710\n",
    "GL 9711\n",
    "GL 9720\n",
    "GL 9721\n",
    "GL 9730\n",
    "GL 9731\n",
    "GL 9750\n",
    "GL 9751\n",
    "GL 9875\n",
    "GL 9876\n",
    "GL 9880\n",
    "GL 9881\n",
    "GL 9885\n",
    "GL 9886\n",
    "GL 9890\n",
    "GL 9891\n",
    "GL 9895\n",
    "GL 9896\n",
    "GL 9905\n",
    "GL 9906\n",
    "GL 9910\n",
    "GL 9911\n",
    "GL 9915\n",
    "GL 9916\n",
    "GL 9920\n",
    "GL 9921\n",
    "GL 9925\n",
    "GL 9926\n",
    "GL 9930\n",
    "GL 9933\n",
    "GL 9935\n",
    "GL 9936\n",
    "GL 9940\n",
    "GL 9941\n",
    "GL 9945\n",
    "GL 9946\n",
    "GM 2100\n",
    "GM 2101\n",
    "GM 2104\n",
    "GM 2106\n",
    "GM 2108\n",
    "GM 2109\n",
    "GM 2112\n",
    "GM 2113\n",
    "GM 2127\n",
    "GM 2128\n",
    "GM 2145\n",
    "GM 2146\n",
    "GM 2149\n",
    "GM 2150\n",
    "GM 2153\n",
    "GM 2154\n",
    "GM 2162\n",
    "GM 2179\n",
    "GM 2180\n",
    "GM 2185\n",
    "GM 2186\n",
    "GM 2206\n",
    "GM 2207\n",
    "GM 2211\n",
    "GM 2212\n",
    "GM 2215\n",
    "GM 2222\n",
    "GM 2223\n",
    "GM 2232\n",
    "GM 2233\n",
    "GM 2257\n",
    "GM 2258\n",
    "GM 2283\n",
    "GM 2284\n",
    "GM 2293\n",
    "GM 2299\n",
    "GM 2300\n",
    "GM 2303\n",
    "GM 2304\n",
    "GM 2307\n",
    "GM 2308\n",
    "GM 2314\n",
    "GM 2315\n",
    "GM 2318\n",
    "GM 2319\n",
    "GM 2322\n",
    "GM 2323\n",
    "GM 2326\n",
    "GM 2330\n",
    "GM 2333\n",
    "GM 2334\n",
    "GM 2361\n",
    "GM 2362\n",
    "GM 2365\n",
    "GM 2366\n",
    "GM 2369\n",
    "GM 2370\n",
    "GM 2375\n",
    "GM 2376\n",
    "GM 2391\n",
    "GM 2392\n",
    "GM 2402\n",
    "GM 2403\n",
    "GM 2414\n",
    "GM 2415\n",
    "GM 2418\n",
    "GM 2420\n",
    "GM 2421\n",
    "GM 2425\n",
    "GM 2426\n",
    "GM 2433\n",
    "GM 2434\n",
    "GM 2441\n",
    "GM 2442\n",
    "GM 2451\n",
    "GM 2452\n",
    "GM 2463\n",
    "GM 2467\n",
    "GM 2468\n",
    "GM 2493\n",
    "GM 2496\n",
    "GM 2498\n",
    "GM 2500\n",
    "GM 2502\n",
    "GM 2503\n",
    "GM 2512\n",
    "GM 2514\n",
    "GM 2517\n",
    "GM 2518\n",
    "GM 2521\n",
    "GM 2522\n",
    "GM 2576\n",
    "GM 2577\n",
    "GM 2595\n",
    "GM 2596\n",
    "GM 2603\n",
    "GM 2604\n",
    "GM 2609\n",
    "GM 2618\n",
    "GM 2619\n",
    "GM 2622\n",
    "GM 2623\n",
    "GM 2626\n",
    "GM 2627\n",
    "GM 2631\n",
    "GM 2632\n",
    "GM 2635\n",
    "GM 2636\n",
    "GM 2657\n",
    "GM 2658\n",
    "GM 2661\n",
    "GM 2663\n",
    "GM 2668\n",
    "GM 2669\n",
    "GM 2677\n",
    "GM 2678\n",
    "GM 2683\n",
    "GM 2684\n",
    "GM 2709\n",
    "GM 2710\n",
    "GM 2736\n",
    "GM 2737\n",
    "GM 2760\n",
    "GM 2761\n",
    "GM 2770\n",
    "GM 2771\n",
    "GM 2782\n",
    "GM 2795\n",
    "GM 2796\n",
    "GM 2801\n",
    "GM 2804\n",
    "GM 2805\n",
    "GM 2812\n",
    "GM 2813\n",
    "GM 2821\n",
    "GM 2822\n",
    "GM 2838\n",
    "GM 2839\n",
    "GM 2845\n",
    "GM 2846\n",
    "GM 2855\n",
    "GM 2856\n",
    "GM 2872\n",
    "GM 2873\n",
    "GM 2876\n",
    "GM 2877\n",
    "GM 2880\n",
    "GM 2881\n",
    "GM 2889\n",
    "GM 2890\n",
    "GM 2906\n",
    "GM 2907\n",
    "GM 2910\n",
    "GM 2911\n",
    "GM 2923\n",
    "GM 2924\n",
    "GM 2941\n",
    "GM 2942\n",
    "GM 2955\n",
    "GM 2956\n",
    "GM 2959\n",
    "GM 2966\n",
    "GM 2967\n",
    "GM 2983\n",
    "GM 2984\n",
    "GM 2987\n",
    "GM 2988\n",
    "GM 2995\n",
    "GM 2997\n",
    "GM 2999\n",
    "GM 3001\n",
    "GM 3002\n",
    "GM 3005\n",
    "GM 3007\n",
    "GM 3008\n",
    "GM 3020\n",
    "GM 3021\n",
    "GM 3024\n",
    "GM 3027\n",
    "GM 3029\n",
    "GM 3031\n",
    "GM 3032\n",
    "GM 3035\n",
    "GM 3036\n",
    "GM 3039\n",
    "GM 3040\n",
    "GM 3046\n",
    "GM 3048\n",
    "GM 3050\n",
    "GM 3051\n",
    "GM 3063\n",
    "GM 3064\n",
    "GM 3071\n",
    "GM 3081\n",
    "GM 3082\n",
    "GM 3085\n",
    "GM 3086\n",
    "GM 3089\n",
    "GM 3090\n",
    "GM 3096\n",
    "GM 3097\n",
    "GM 3104\n",
    "GM 3114\n",
    "GM 3115\n",
    "GM 3131\n",
    "GM 3132\n",
    "GM 3139\n",
    "GM 3140\n",
    "GM 3152\n",
    "GM 3153\n",
    "GM 3156\n",
    "GM 3157\n",
    "GM 3160\n",
    "GM 3161\n",
    "GM 3166\n",
    "GM 3167\n",
    "GM 3175\n",
    "GM 3176\n",
    "GM 3181\n",
    "GM 3182\n",
    "GM 3188\n",
    "GM 3193\n",
    "GM 3194\n",
    "GM 3201\n",
    "GM 3202\n",
    "GM 3205\n",
    "GM 3206\n",
    "GM 3211\n",
    "GM 3214\n",
    "GM 3215\n",
    "GM 3220\n",
    "GM 3221\n",
    "GM 3232\n",
    "GM 3233\n",
    "GM 3295\n",
    "GM 3296\n",
    "GM 3303\n",
    "GM 3304\n",
    "GM 3329\n",
    "GM 3331\n",
    "GM 3332\n",
    "GM 3345\n",
    "GM 3346\n",
    "GM 3353\n",
    "GM 3354\n",
    "GM 3359\n",
    "GM 3361\n",
    "GM 3363\n",
    "GM 3364\n",
    "GM 3369\n",
    "GM 3370\n",
    "GM 3375\n",
    "GM 3376\n",
    "GM 3381\n",
    "GM 3384\n",
    "GM 3385\n",
    "GM 3390\n",
    "GM 3391\n",
    "GM 3411\n",
    "GM 3412\n",
    "GM 3415\n",
    "GM 3416\n",
    "GM 3420\n",
    "GM 3421\n",
    "GM 3438\n",
    "GM 3439\n",
    "GM 3443\n",
    "GM 3444\n",
    "GM 3453\n",
    "GM 3454\n",
    "GM 3463\n",
    "GM 3464\n",
    "GM 3475\n",
    "GM 3476\n",
    "GM 3491\n",
    "GM 3492\n",
    "GM 3502\n",
    "GM 3503\n",
    "GM 3517\n",
    "GM 3518\n",
    "GM 3543\n",
    "GM 3544\n",
    "GM 3563\n",
    "GM 3571\n",
    "GM 3572\n",
    "GM 3582\n",
    "GM 3583\n",
    "GM 3586\n",
    "GM 3590\n",
    "GM 3593\n",
    "GM 3594\n",
    "GM 3601\n",
    "GM 3602\n",
    "GM 3605\n",
    "GM 3613\n",
    "GM 3614\n",
    "GM 3624\n",
    "GM 3625\n",
    "GM 3629\n",
    "GM 3632\n",
    "GM 3634\n",
    "GM 3636\n",
    "GM 3639\n",
    "GM 3640\n",
    "GM 3645\n",
    "GM 3646\n",
    "GM 3653\n",
    "GM 3654\n",
    "GM 3667\n",
    "GM 3668\n",
    "GM 3671\n",
    "GM 3672\n",
    "GM 3675\n",
    "GM 3676\n",
    "GM 3680\n",
    "GM 3681\n",
    "GM 3693\n",
    "GM 3694\n",
    "GM 3697\n",
    "GM 3699\n",
    "GM 3700\n",
    "GM 3711\n",
    "GM 3712\n",
    "GM 3715\n",
    "GM 3716\n",
    "GM 3721\n",
    "GM 3722\n",
    "GM 3730\n",
    "GM 3731\n",
    "GM 3746\n",
    "GM 3747\n",
    "GM 3760\n",
    "GM 3761\n",
    "GM 3772\n",
    "GM 3773\n",
    "GM 3795\n",
    "GM 3796\n",
    "GM 3805\n",
    "GM 3817\n",
    "GM 3819\n",
    "GM 3821\n",
    "GM 3822\n",
    "GM 3828\n",
    "GM 3830\n",
    "GM 3831\n",
    "GM 3845\n",
    "GM 3846\n",
    "GM 3855\n",
    "GM 3856\n",
    "GM 3859\n",
    "GM 3882\n",
    "GM 3883\n",
    "GM 3886\n",
    "GM 3896\n",
    "GM 3901\n",
    "GM 3902\n",
    "GM 3915\n",
    "GM 3916\n",
    "GM 3932\n",
    "GM 3933\n",
    "GM 3940\n",
    "GM 3941\n",
    "GM 3950\n",
    "GM 3951\n",
    "GM 3961\n",
    "GM 3962\n",
    "GM 3971\n",
    "GM 3972\n",
    "GM 3977\n",
    "GM 3978\n",
    "GM 3985\n",
    "GM 3986\n",
    "GM 3995\n",
    "GM 3996\n",
    "GM 4001\n",
    "GM 4002\n",
    "GM 4026\n",
    "GM 4027\n",
    "GM 4039\n",
    "GM 4052\n",
    "GM 4053\n",
    "GM 4060\n",
    "GM 4061\n",
    "GM 4065\n",
    "GM 4067\n",
    "GM 4069\n",
    "GM 4071\n",
    "GM 4072\n",
    "GM 4078\n",
    "GM 4079\n",
    "GM 4101\n",
    "GM 4102\n",
    "GM 4105\n",
    "GM 4111\n",
    "GM 4124\n",
    "GM 4125\n",
    "GM 4137\n",
    "GM 4138\n",
    "GM 4146\n",
    "GM 4147\n",
    "GM 4160\n",
    "GM 4161\n",
    "GM 4164\n",
    "GM 4165\n",
    "GM 4172\n",
    "GM 4173\n",
    "GM 4201\n",
    "GM 4202\n",
    "GM 4220\n",
    "GM 4222\n",
    "GM 4226\n",
    "GM 4232\n",
    "GM 4233\n",
    "GM 4245\n",
    "GM 4246\n",
    "GM 4251\n",
    "GM 4252\n",
    "GM 4276\n",
    "GM 4277\n",
    "GM 4302\n",
    "GM 4303\n",
    "GM 4307\n",
    "GM 4311\n",
    "GM 4313\n",
    "GM 4315\n",
    "GM 4316\n",
    "GM 4325\n",
    "GM 4326\n",
    "GM 4341\n",
    "GM 4342\n",
    "GM 4355\n",
    "GM 4356\n",
    "GM 4376\n",
    "GM 4377\n",
    "GM 4390\n",
    "GM 4391\n",
    "GM 4394\n",
    "GM 4395\n",
    "GM 4402\n",
    "GM 4403\n",
    "GM 4408\n",
    "GM 4412\n",
    "GM 4417\n",
    "GM 4419\n",
    "GM 4423\n",
    "GM 4425\n",
    "GM 4426\n",
    "GM 4452\n",
    "GM 4453\n",
    "GM 4456\n",
    "GM 4460\n",
    "GM 4462\n",
    "GM 4468\n",
    "GM 4472\n",
    "GM 4476\n",
    "GM 4477\n",
    "GM 4502\n",
    "GM 4503\n",
    "GM 4506\n",
    "GM 4507\n",
    "GM 4510\n",
    "GM 4511\n",
    "GM 4518\n",
    "GM 4519\n",
    "GM 4525\n",
    "GM 4526\n",
    "GM 4530\n",
    "GM 4531\n",
    "GM 4535\n",
    "GM 4540\n",
    "GM 4541\n",
    "GM 4551\n",
    "GM 4552\n",
    "GM 4575\n",
    "GM 4576\n",
    "GM 4601\n",
    "GM 4602\n",
    "GM 4613\n",
    "GM 4614\n",
    "GM 4660\n",
    "GM 4668\n",
    "GM 4669\n",
    "GM 4701\n",
    "GM 4702\n",
    "GM 4713\n",
    "GM 4714\n",
    "GM 4721\n",
    "GM 4725\n",
    "GM 4727\n",
    "GM 4730\n",
    "GM 4733\n",
    "GM 4736\n",
    "GM 4737\n",
    "GM 4744\n",
    "GM 4745\n",
    "GM 4752\n",
    "GM 4753\n",
    "GM 4758\n",
    "GM 4759\n",
    "GM 4777\n",
    "GM 4778\n",
    "GM 4792\n",
    "GM 4794\n",
    "GM 4798\n",
    "GM 4799\n",
    "GM 4802\n",
    "GM 4804\n",
    "GM 4810\n",
    "GM 4811\n",
    "GM 4814\n",
    "GM 4816\n",
    "GM 4818\n",
    "GM 4820\n",
    "GM 4824\n",
    "GM 4825\n",
    "GM 4828\n",
    "GM 4830\n",
    "GM 4831\n",
    "GM 4834\n",
    "GM 4836\n",
    "GM 4837\n",
    "GM 4840\n",
    "GM 4841\n",
    "GM 4844\n",
    "GM 4845\n",
    "GM 4848\n",
    "GM 4849\n",
    "GM 4860\n",
    "GM 4861\n",
    "GM 4872\n",
    "GM 4873\n",
    "GM 4879\n",
    "GM 4884\n",
    "GM 4885\n",
    "GM 4890\n",
    "GM 4891\n",
    "GM 4894\n",
    "GM 4901\n",
    "GM 4902\n",
    "GM 4912\n",
    "GM 4913\n",
    "GM 4916\n",
    "GM 4918\n",
    "GM 4919\n",
    "GM 4922\n",
    "GM 4923\n",
    "GM 4927\n",
    "GM 4928\n",
    "GM 4938\n",
    "GM 4939\n",
    "GM 4942\n",
    "GM 4943\n",
    "GM 4947\n",
    "GM 4948\n",
    "GM 4951\n",
    "GM 4953\n",
    "GM 4956\n",
    "GM 4957\n",
    "GM 4964\n",
    "GM 4967\n",
    "GM 4968\n",
    "GM 4979\n",
    "GM 4980\n",
    "GM 4993\n",
    "GM 4994\n",
    "GM 4997\n",
    "GM 4998\n",
    "GM 5001\n",
    "GM 5005\n",
    "GM 5009\n",
    "GM 5014\n",
    "GM 5015\n",
    "GM 5021\n",
    "GM 5022\n",
    "GM 5035\n",
    "GM 5036\n",
    "GM 5050\n",
    "GM 5051\n",
    "GM 5054\n",
    "GM 5056\n",
    "GM 5060\n",
    "GM 5061\n",
    "GM 5066\n",
    "GM 5070\n",
    "GM 5071\n",
    "GM 5075\n",
    "GM 5076\n",
    "GM 5083\n",
    "GM 5085\n",
    "GM 5087\n",
    "GM 5090\n",
    "GM 5091\n",
    "GM 5094\n",
    "GM 5095\n",
    "GM 5110\n",
    "GM 5111\n",
    "GM 5120\n",
    "GM 5121\n",
    "GM 5143\n",
    "GM 5144\n",
    "GM 5162\n",
    "GM 5163\n",
    "GM 5202\n",
    "GM 5203\n",
    "GM 5206\n",
    "GM 5208\n",
    "GM 5210\n",
    "GM 5213\n",
    "GM 5219\n",
    "GM 5220\n",
    "GM 5225\n",
    "GM 5226\n",
    "GM 5230\n",
    "GM 5232\n",
    "GM 5233\n",
    "GM 5240\n",
    "GM 5242\n",
    "GM 5248\n",
    "GM 5249\n",
    "GM 5252\n",
    "GM 5253\n",
    "GM 5268\n",
    "GM 5269\n",
    "GM 5273\n",
    "GM 5274\n",
    "GM 5277\n",
    "GM 5278\n",
    "GM 5285\n",
    "GM 5286\n",
    "GM 5291\n",
    "GM 5292\n",
    "GM 5295\n",
    "GM 5296\n",
    "GM 5302\n",
    "GM 5303\n",
    "GM 5308\n",
    "GM 5309\n",
    "GM 5313\n",
    "GM 5314\n",
    "GM 5320\n",
    "GM 5321\n",
    "GM 5333\n",
    "GM 5334\n",
    "GM 5342\n",
    "GM 5343\n",
    "GM 5352\n",
    "GM 5371\n",
    "GM 5372\n",
    "GM 5377\n",
    "GM 5401\n",
    "GM 5402\n",
    "GM 5407\n",
    "GM 5408\n",
    "GM 5433\n",
    "GM 5434\n",
    "GM 5515\n",
    "GM 5516\n",
    "GM 5565\n",
    "GM 5566\n",
    "GM 5595\n",
    "GM 5596\n",
    "GM 5610\n",
    "GM 5611\n",
    "GM 5621\n",
    "GM 5622\n",
    "GM 5650\n",
    "GM 5652\n",
    "GM 5654\n",
    "GM 5655\n",
    "GM 5658\n",
    "GM 5662\n",
    "GM 5663\n",
    "GM 5683\n",
    "GM 5684\n",
    "GM 5687\n",
    "GM 5688\n",
    "GM 5693\n",
    "GM 5694\n",
    "GM 5724\n",
    "GM 5725\n",
    "GM 5728\n",
    "GM 5731\n",
    "GM 5732\n",
    "GM 5746\n",
    "GM 5747\n",
    "GM 5755\n",
    "GM 5756\n",
    "GM 5760\n",
    "GM 5770\n",
    "GM 5771\n",
    "GM 5790\n",
    "GM 5791\n",
    "GM 5821\n",
    "GM 5822\n",
    "GM 5835\n",
    "GM 5836\n",
    "GM 5845\n",
    "GM 5846\n",
    "GM 5853\n",
    "GM 5854\n",
    "GM 5861\n",
    "GM 5862\n",
    "GM 5865\n",
    "GM 5885\n",
    "GM 5886\n",
    "GM 5895\n",
    "GM 5896\n",
    "GM 5935\n",
    "GM 5936\n",
    "GM 5942\n",
    "GM 5943\n",
    "GM 5991\n",
    "GM 5992\n",
    "GM 5995\n",
    "GM 6005\n",
    "GM 6013\n",
    "GM 6021\n",
    "GM 6022\n",
    "GM 6052\n",
    "GM 6053\n",
    "GM 6057\n",
    "GM 6058\n",
    "GM 6063\n",
    "GM 6064\n",
    "GM 6075\n",
    "GM 6094\n",
    "GM 6095\n",
    "GM 6125\n",
    "GM 6126\n",
    "GM 6138\n",
    "GM 6140\n",
    "GM 6141\n",
    "GM 6166\n",
    "GM 6167\n",
    "GM 6195\n",
    "GM 6196\n",
    "GM 6205\n",
    "GM 6206\n",
    "GM 6235\n",
    "GM 6236\n",
    "GM 6243\n",
    "GM 6244\n",
    "GM 6257\n",
    "GM 6271\n",
    "GM 6272\n",
    "GM 6279\n",
    "GM 6280\n",
    "GM 6295\n",
    "GM 6296\n",
    "GM 6325\n",
    "GM 6326\n",
    "GM 6335\n",
    "GM 6375\n",
    "GM 6376\n",
    "GM 6390\n",
    "GM 6391\n",
    "GM 6406\n",
    "GM 6407\n",
    "GM 6420\n",
    "GM 6421\n",
    "GM 6436\n",
    "GM 6437\n",
    "GM 6465\n",
    "GM 6466\n",
    "GM 6481\n",
    "GM 6482\n",
    "GM 6501\n",
    "GM 6502\n",
    "GM 6505\n",
    "GM 6506\n",
    "GM 6540\n",
    "GM 6541\n",
    "GM 6562\n",
    "GM 6563\n",
    "GM 6570\n",
    "GM 6571\n",
    "GM 6586\n",
    "GM 6587\n",
    "GM 6593\n",
    "GM 6594\n",
    "GM 6603\n",
    "GM 6604\n",
    "GM 6613\n",
    "GM 6623\n",
    "GM 6624\n",
    "GM 6635\n",
    "GM 6675\n",
    "GM 6676\n",
    "GM 6683\n",
    "GM 6684\n",
    "GM 6725\n",
    "GM 6726\n",
    "GM 6737\n",
    "GM 6738\n",
    "GM 6745\n",
    "GM 6761\n",
    "GM 6762\n",
    "GM 6790\n",
    "GM 6791\n",
    "GM 6795\n",
    "GM 6796\n",
    "GM 6836\n",
    "GM 6837\n",
    "GM 6840\n",
    "GM 6841\n",
    "GM 6865\n",
    "GM 6866\n",
    "GM 6875\n",
    "GM 6901\n",
    "GM 6902\n",
    "GM 6925\n",
    "GM 6926\n",
    "GM 6935\n",
    "GM 6936\n",
    "GM 7015\n",
    "GM 7016\n",
    "GM 7045\n",
    "GM 7046\n",
    "GM 7080\n",
    "GM 7081\n",
    "GM 7090\n",
    "GM 7091\n",
    "GM 7103\n",
    "GM 7104\n",
    "GM 7136\n",
    "GM 7137\n",
    "GM 7145\n",
    "GM 7146\n",
    "GM 7173\n",
    "GM 7174\n",
    "GM 7185\n",
    "GM 7186\n",
    "GM 7251\n",
    "GM 7252\n",
    "GM 7312\n",
    "GM 7313\n",
    "GM 7319\n",
    "GM 7321\n",
    "GM 7323\n",
    "GM 7324\n",
    "GM 7388\n",
    "GM 7398\n",
    "GM 7399\n",
    "GM 7435\n",
    "GM 7436\n",
    "GM 7470\n",
    "GM 7495\n",
    "GM 7496\n",
    "GM 7499\n",
    "GM 7500\n",
    "GM 7505\n",
    "GM 7506\n",
    "GN 2516\n",
    "GN 2520\n",
    "GN 2571\n",
    "GN 2600\n",
    "GN 2612\n",
    "GN 2614\n",
    "GN 2617\n",
    "GN 2621\n",
    "GN 2633\n",
    "GN 2651\n",
    "GN 2689\n",
    "GN 2691\n",
    "GN 2693\n",
    "GN 2723\n",
    "GN 2724\n",
    "GN 2781\n",
    "GN 2800\n",
    "GN 2804\n",
    "GN 2814\n",
    "GN 2830\n",
    "GN 2842\n",
    "GN 2850\n",
    "GN 2890\n",
    "GN 2931\n",
    "GN 2935\n",
    "GN 2946\n",
    "GN 2947\n",
    "GN 3058\n",
    "GN 3070\n",
    "GN 3090\n",
    "GN 3173\n",
    "GN 3177\n",
    "GN 3179\n",
    "GN 3181\n",
    "GN 3183\n",
    "GN 3187\n",
    "GN 3189\n",
    "GN 3191\n",
    "GN 3195\n",
    "GN 3199\n",
    "GN 3201\n",
    "GN 3203\n",
    "GN 3205\n",
    "GN 3210\n",
    "GN 3215\n",
    "GN 3219\n",
    "GN 3221\n",
    "GN 3223\n",
    "GN 3227\n",
    "GN 3230\n",
    "GN 3232\n",
    "GN 3246\n",
    "GN 3248\n",
    "GN 3250\n",
    "GN 3254\n",
    "GN 3261\n",
    "GN 3279\n",
    "GN 3280\n",
    "GN 3290\n",
    "GN 3300\n",
    "GN 3401\n",
    "GN 3646\n",
    "GN 3653\n",
    "GN 3655\n",
    "GN 3657\n",
    "GN 3659\n",
    "GN 3661\n",
    "GN 3665\n",
    "GN 3667\n",
    "GN 3669\n",
    "GN 3671\n",
    "GN 3673\n",
    "GN 3679\n",
    "GN 3685\n",
    "GN 3693\n",
    "GN 3695\n",
    "GN 3701\n",
    "GN 3707\n",
    "GN 3711\n",
    "GN 3713\n",
    "GN 3715\n",
    "GN 3717\n",
    "GN 3721\n",
    "GN 3725\n",
    "GN 3726\n",
    "GN 3751\n",
    "GN 3763\n",
    "GN 3776\n",
    "GN 3790\n",
    "GN 3837\n",
    "GN 3840\n",
    "GN 3842\n",
    "GN 3844\n",
    "GN 3848\n",
    "GN 3850\n",
    "GN 3854\n",
    "GN 3858\n",
    "GN 3864\n",
    "GN 3868\n",
    "GN 3870\n",
    "GN 3872\n",
    "GN 3876\n",
    "GN 3886\n",
    "GN 3907\n",
    "GN 3964\n",
    "GN 3970\n",
    "GN 3990\n",
    "GN 3991\n",
    "GN 4058\n",
    "GN 4081\n",
    "GN 4100\n",
    "GN 4110\n",
    "GN 4136\n",
    "GN 4140\n",
    "GN 4154\n",
    "GN 4165\n",
    "GN 4169\n",
    "GN 4170\n",
    "GN 4179\n",
    "GN 4195\n",
    "GN 4271\n",
    "GN 4272\n",
    "GN 4276\n",
    "GN 4382\n",
    "GN 4400\n",
    "GN 4450\n",
    "GN 4452\n",
    "GN 4455\n",
    "GN 4493\n",
    "GN 4494\n",
    "GN 4498\n",
    "GN 4501\n",
    "GN 4505\n",
    "GN 4511\n",
    "GN 4521\n",
    "GN 4523\n",
    "GN 4527\n",
    "GN 4531\n",
    "GN 4533\n",
    "GN 4535\n",
    "GN 4537\n",
    "GN 4539\n",
    "GN 4570\n",
    "GN 4575\n",
    "GN 4580\n",
    "GN 4584\n",
    "GN 4586\n",
    "GN 4592\n",
    "GN 4594\n",
    "GN 4596\n",
    "GN 4599\n",
    "GN 4600\n",
    "GN 4620\n",
    "GN 4640\n",
    "GN 4728\n",
    "GN 4732\n",
    "GN 4735\n",
    "GN 4745\n",
    "GN 4747\n",
    "GN 4749\n",
    "GN 4751\n",
    "GN 4753\n",
    "GN 4755\n",
    "GN 4766\n",
    "GN 4795\n",
    "GN 4801\n",
    "GN 4827\n",
    "GN 4828\n",
    "GN 4832\n",
    "GN 4835\n",
    "GN 4855\n",
    "GN 4870\n",
    "GN 4880\n",
    "GN 4884\n",
    "GN 4909\n",
    "GN 4939\n",
    "GN 4946\n",
    "GN 4975\n",
    "GN 4999\n",
    "GN 5049\n",
    "GN 5050\n",
    "GN 5053\n",
    "GN 5079\n",
    "GN 5083\n",
    "GN 5091\n",
    "GN 5110\n",
    "GN 5120\n",
    "GN 5126\n",
    "GN 5134\n",
    "GN 5136\n",
    "GN 5140\n",
    "GN 5144\n",
    "GN 5150\n",
    "GN 5156\n",
    "GN 5160\n",
    "GN 5162\n",
    "GN 5168\n",
    "GN 5186\n",
    "GN 5273\n",
    "GN 5277\n",
    "GN 5278\n",
    "GN 5300\n",
    "GN 5420\n",
    "GN 5435\n",
    "GN 5500\n",
    "GN 5551\n",
    "GN 5575\n",
    "GN 5596\n",
    "GN 5605\n",
    "GN 5606\n",
    "GN 5631\n",
    "GN 5635\n",
    "GN 5641\n",
    "GN 5648\n",
    "GN 5651\n",
    "GN 5661\n",
    "GN 5699\n",
    "GN 5716\n",
    "GN 5717\n",
    "GN 5732\n",
    "GN 5740\n",
    "GN 5751\n",
    "GN 5771\n",
    "GN 5775\n",
    "GN 5805\n",
    "GN 5818\n",
    "GN 5820\n",
    "GN 5824\n",
    "GN 5828\n",
    "GN 5834\n",
    "GN 5939\n",
    "GN 5943\n",
    "GN 6031\n",
    "GN 6049\n",
    "GN 6050\n",
    "GN 6111\n",
    "GN 6151\n",
    "GN 6274\n",
    "GN 6384\n",
    "GN 6385\n",
    "GN 6495\n",
    "GN 6499\n",
    "GN 6501\n",
    "GN 6505\n",
    "GN 6511\n",
    "GN 6513\n",
    "GN 6515\n",
    "GN 6538\n",
    "GN 6540\n",
    "GN 6544\n",
    "GN 6561\n",
    "GN 6576\n",
    "GN 6581\n",
    "GN 6587\n",
    "GN 6591\n",
    "GN 6593\n",
    "GN 6595\n",
    "GN 6606\n",
    "GN 6607\n",
    "GN 6621\n",
    "GN 6631\n",
    "GN 6640\n",
    "GN 6667\n",
    "GN 6671\n",
    "GN 6681\n",
    "GN 6688\n",
    "GN 6691\n",
    "GN 6705\n",
    "GN 6707\n",
    "GN 6709\n",
    "GN 6711\n",
    "GN 6713\n",
    "GN 6715\n",
    "GN 6720\n",
    "GN 6726\n",
    "GN 6740\n",
    "GN 6750\n",
    "GN 6764\n",
    "GN 6771\n",
    "GN 6829\n",
    "GN 6830\n",
    "GN 6835\n",
    "GN 6841\n",
    "GN 6880\n",
    "GN 6891\n",
    "GN 6898\n",
    "GN 6901\n",
    "GN 6911\n",
    "GN 6921\n",
    "GN 6941\n",
    "GN 6942\n",
    "GN 6948\n",
    "GN 6949\n",
    "GN 6960\n",
    "GN 7030\n",
    "GN 7034\n",
    "GN 7044\n",
    "GN 7050\n",
    "GN 7054\n",
    "GN 7058\n",
    "GN 7164\n",
    "GN 7168\n",
    "GN 7172\n",
    "GN 7174\n",
    "GN 7176\n",
    "GN 7181\n",
    "GN 7183\n",
    "GN 7189\n",
    "GN 7191\n",
    "GN 7193\n",
    "GN 7201\n",
    "GN 7216\n",
    "GN 7240\n",
    "GN 7250\n",
    "GN 7263\n",
    "GN 7267\n",
    "GN 7269\n",
    "GN 7271\n",
    "GN 7273\n",
    "GN 7275\n",
    "GN 7382\n",
    "GN 7384\n",
    "GN 7386\n",
    "GN 7390\n",
    "GN 7392\n",
    "GN 7396\n",
    "GN 7411\n",
    "GN 7440\n",
    "GN 7451\n",
    "GN 7461\n",
    "GN 7475\n",
    "GN 7486\n",
    "GN 7496\n",
    "GN 7497\n",
    "GN 7551\n",
    "GN 7581\n",
    "GN 7607\n",
    "GN 7608\n",
    "GN 7615\n",
    "GN 7632\n",
    "GN 7635\n",
    "GN 7647\n",
    "GN 7650\n",
    "GN 7653\n",
    "GN 7655\n",
    "GN 7657\n",
    "GN 7659\n",
    "GN 7661\n",
    "GN 7669\n",
    "GN 7673\n",
    "GN 7693\n",
    "GN 7700\n",
    "GN 7715\n",
    "GN 7718\n",
    "GN 7719\n",
    "GN 7730\n",
    "GN 7732\n",
    "GN 7734\n",
    "GN 7741\n",
    "GN 7745\n",
    "GN 7751\n",
    "GN 7758\n",
    "GN 7760\n",
    "GN 7766\n",
    "GN 7770\n",
    "GN 7776\n",
    "GN 7778\n",
    "GN 7780\n",
    "GN 7782\n",
    "GN 7785\n",
    "GN 7789\n",
    "GN 7791\n",
    "GN 7818\n",
    "GN 7822\n",
    "GN 7826\n",
    "GN 7830\n",
    "GN 7832\n",
    "GN 7836\n",
    "GN 7838\n",
    "GN 7840\n",
    "GN 7842\n",
    "GN 7844\n",
    "GN 7848\n",
    "GN 7850\n",
    "GN 7852\n",
    "GN 7858\n",
    "GN 7862\n",
    "GN 7876\n",
    "GN 7880\n",
    "GN 7882\n",
    "GN 7884\n",
    "GN 7888\n",
    "GN 7889\n",
    "GN 7892\n",
    "GN 7896\n",
    "GN 7900\n",
    "GN 7908\n",
    "GN 7910\n",
    "GN 7913\n",
    "GN 7914\n",
    "GN 7918\n",
    "GN 7924\n",
    "GN 7970\n",
    "GN 7972\n",
    "GN 7975\n",
    "GN 7977\n",
    "GN 7981\n",
    "GN 7987\n",
    "GN 7989\n",
    "GN 7991\n",
    "GN 8000\n",
    "GN 8006\n",
    "GN 8024\n",
    "GN 8027\n",
    "GN 8030\n",
    "GN 8032\n",
    "GN 8036\n",
    "GN 8039\n",
    "GN 8049\n",
    "GN 8059\n",
    "GN 8064\n",
    "GN 8071\n",
    "GN 8080\n",
    "GN 8082\n",
    "GN 8086\n",
    "GN 8091\n",
    "GN 8093\n",
    "GN 8095\n",
    "GN 8101\n",
    "GN 8145\n",
    "GN 8256\n",
    "GN 8291\n",
    "GN 8295\n",
    "GN 8366\n",
    "GN 8478\n",
    "GN 8490\n",
    "GN 8561\n",
    "GN 8584\n",
    "GN 8589\n",
    "GN 8610\n",
    "GN 8631\n",
    "GN 8639\n",
    "GN 8641\n",
    "GN 8646\n",
    "GN 8651\n",
    "GN 8655\n",
    "GN 8657\n",
    "GN 8660\n",
    "GN 8683\n",
    "GN 8687\n",
    "GN 8691\n",
    "GN 8700\n",
    "GN 8795\n",
    "GN 8796\n",
    "GN 8810\n",
    "GN 8816\n",
    "GN 8830\n",
    "GN 8851\n",
    "GN 8854\n",
    "GN 8856\n",
    "GN 8858\n",
    "GN 8861\n",
    "GN 8865\n",
    "GN 8871\n",
    "GN 8877\n",
    "GN 8881\n",
    "GN 8887\n",
    "GN 8889\n",
    "GN 8891\n",
    "GN 8894\n",
    "GN 8897\n",
    "GN 8899\n",
    "GN 9001\n",
    "GN 9013\n",
    "GN 9097\n",
    "GN 9124\n",
    "GN 9126\n",
    "GN 9128\n",
    "GN 9130\n",
    "GN 9132\n",
    "GN 9135\n",
    "GN 9137\n",
    "GN 9146\n",
    "GN 9150\n",
    "GN 9154\n",
    "GN 9158\n",
    "GN 9162\n",
    "GN 9173\n",
    "GN 9183\n",
    "GN 9187\n",
    "GN 9189\n",
    "GN 9191\n",
    "GN 9193\n",
    "GN 9195\n",
    "GN 9197\n",
    "GN 9201\n",
    "GN 9213\n",
    "GN 9217\n",
    "GN 9221\n",
    "GN 9237\n",
    "GN 9251\n",
    "GN 9281\n",
    "GN 9283\n",
    "GN 9285\n",
    "GN 9287\n",
    "GN 9291\n",
    "GN 9292\n",
    "GN 9297\n",
    "GN 9301\n",
    "GN 9447\n",
    "GN 9450\n",
    "GN 9453\n",
    "GN 9455\n",
    "GN 9457\n",
    "GN 9461\n",
    "GN 9470\n",
    "GN 9478\n",
    "GN 9481\n",
    "GN 9500\n",
    "GN 9505\n",
    "GN 9510\n",
    "GN 9513\n",
    "GN 9521\n",
    "GN 9525\n",
    "GN 9531\n",
    "GN 9533\n",
    "GN 9535\n",
    "GN 9537\n",
    "GN 9541\n",
    "GN 9543\n",
    "GN 9545\n",
    "GN 9547\n",
    "GN 9549\n",
    "GN 9551\n",
    "GN 9553\n",
    "GN 9555\n",
    "GN 9557\n",
    "GN 9558\n",
    "GN 9566\n",
    "GN 9570\n",
    "GN 9572\n",
    "GN 9574\n",
    "GN 9577\n",
    "GN 9581\n",
    "GN 9607\n",
    "GN 9611\n",
    "GN 9640\n",
    "GN 9648\n",
    "GN 9656\n",
    "GN 9668\n",
    "GN 9669\n",
    "GN 9674\n",
    "GN 9780\n",
    "GN 9790\n",
    "GN 9851\n",
    "GN 9855\n",
    "GN 9871\n",
    "GN 9891\n",
    "GN 9906\n",
    "GN 9908\n",
    "GN 9912\n",
    "GN 9914\n",
    "GN 9916\n",
    "GN 9920\n",
    "GN 9927\n",
    "GN 9931\n",
    "GN 9935\n",
    "GN 9939\n",
    "GN 9941\n",
    "GN 9943\n",
    "GN 9947\n",
    "GN 9949\n",
    "GN 9952\n",
    "GN 9957\n",
    "GN 9959\n",
    "GN 9961\n",
    "GN 9967\n",
    "GN 9971\n",
    "GN 9979\n",
    "GN 9983\n",
    "GN 9993\n",
    "GO 41070\n",
    "GO 41650\n",
    "GO 48438\n",
    "GO 52310\n",
    "GO 66665\n",
    "GO 67150\n",
    "GO 67350\n",
    "GO 67700\n",
    "GO 67836\n",
    "GO 72090\n",
    "GE 6733-GE 6940\n",
    "GE 6733-GE 6799\n",
    "GE 6733\n",
    "GE 6741-GE 6769\n",
    "GE 6741\n",
    "GE 6742\n",
    "GE 6743\n",
    "GE 6744\n",
    "GE 6745\n",
    "GE 6746\n",
    "GE 6747\n",
    "GE 6748\n",
    "GE 6749\n",
    "GE 6750\n",
    "GE 6751\n",
    "GE 6752\n",
    "GE 6753\n",
    "GE 6754\n",
    "GE 6755\n",
    "GE 6756\n",
    "GE 6757\n",
    "GE 6758\n",
    "GE 6759\n",
    "GE 6760\n",
    "GE 6761\n",
    "GE 6762\n",
    "GE 6763\n",
    "GE 6764\n",
    "GE 6765\n",
    "GE 6766\n",
    "GE 6767\n",
    "GE 6768\n",
    "GE 6769\n",
    "GE 6771-GE 6799\n",
    "GE 6771\n",
    "GE 6772\n",
    "GE 6773\n",
    "GE 6774\n",
    "GE 6775\n",
    "GE 6776\n",
    "GE 6777\n",
    "GE 6778\n",
    "GE 6779\n",
    "GE 6780\n",
    "GE 6781\n",
    "GE 6782\n",
    "GE 6783\n",
    "GE 6784\n",
    "GE 6785\n",
    "GE 6786\n",
    "GE 6787\n",
    "GE 6788\n",
    "GE 6789\n",
    "GE 6790\n",
    "GE 6791\n",
    "GE 6792\n",
    "GE 6793\n",
    "GE 6794\n",
    "GE 6795\n",
    "GE 6796\n",
    "GE 6797\n",
    "GE 6798\n",
    "GE 6799\n",
    "GE 6801-GE 6819\n",
    "GE 6801\n",
    "GE 6806\n",
    "GE 6811-GE 6819\n",
    "GE 6811\n",
    "GE 6814\n",
    "GE 6817\n",
    "GE 6819\n",
    "GE 6821-GE 6909\n",
    "GE 6821\n",
    "GE 6824\n",
    "GE 6833-GE 6909\n",
    "GE 6833\n",
    "GE 6844\n",
    "GE 6851\n",
    "GE 6863\n",
    "GE 6868\n",
    "GE 6875\n",
    "GE 6878\n",
    "GE 6879\n",
    "GE 6881-GE 6909\n",
    "GE 6910-GE 6917\n",
    "GE 6910\n",
    "GE 6911\n",
    "GE 6912\n",
    "GE 6913\n",
    "GE 6914\n",
    "GE 6915\n",
    "GE 6916\n",
    "GE 6917\n",
    "GE 6918\n",
    "GE 6919\n",
    "GE 6920-GE 6940\n",
    "GE 6920\n",
    "GE 6922\n",
    "GE 6923\n",
    "GE 6927\n",
    "GE 6929\n",
    "GE 6930\n",
    "GE 6931\n",
    "GE 6932\n",
    "GE 6934\n",
    "GE 6935\n",
    "GE 6937\n",
    "GE 6938\n",
    "GE 6939\n",
    "GE 6940\n",
    "GG 4900-GG 4960\n",
    "GG 4900\n",
    "GG 4920\n",
    "GG 4940\n",
    "GH 1971-GH 1999\n",
    "GH 1971\n",
    "GH 1972\n",
    "GH 1973\n",
    "GH 1974\n",
    "GH 1975\n",
    "GH 1976\n",
    "GH 1977\n",
    "GH 1978\n",
    "GH 1979\n",
    "GH 1980\n",
    "GH 1981\n",
    "GH 1982\n",
    "GH 1983\n",
    "GH 1984\n",
    "GH 1985\n",
    "GH 1986\n",
    "GH 1987\n",
    "GH 1988\n",
    "GH 1989\n",
    "GH 1990\n",
    "GH 1991\n",
    "GH 1992\n",
    "GH 1993\n",
    "GH 1994\n",
    "GH 1995\n",
    "GH 1996\n",
    "GH 1997\n",
    "GH 1998\n",
    "GH 1999\n",
    "GI 2041-GI 2103\n",
    "GI 2041\n",
    "GI 2052\n",
    "GI 2085\n",
    "GI 2103\n",
    "GK 2205-GK 2230\n",
    "GK 2205-GK 2210\n",
    "GK 2205\n",
    "GK 2210\n",
    "GK 2215-GK 2220\n",
    "GK 2215\n",
    "GK 2220\n",
    "GK 2225-GK 2230\n",
    "GK 2225\n",
    "GK 2230\n",
    "GK 2975-GK 2988\n",
    "GK 2975-GK 2977\n",
    "GK 2975\n",
    "GK 2977\n",
    "GK 2980-GK 2983\n",
    "GK 2980\n",
    "GK 2983\n",
    "GK 2985-GK 2988\n",
    "GK 2985\n",
    "GK 2988\n",
    "GL 1891\n",
    "GL 1901\n",
    "GL 1904-GL 1906\n",
    "GL 1904\n",
    "GL 1905\n",
    "GL 1906\n",
    "GL 1909-GL 1913\n",
    "GL 1909\n",
    "GL 1911\n",
    "GL 1913\n",
    "GL 1915-GL 1919\n",
    "GL 1915\n",
    "GL 1917\n",
    "GL 1918\n",
    "GL 1919\n",
    "GM 1990-GM 2041\n",
    "GM 1990\n",
    "GM 2021\n",
    "GM 2041\n",
    "GN 2195-GN 2429\n",
    "GN 2195\n",
    "GN 2255\n",
    "GN 2306\n",
    "GN 2336\n",
    "GN 2366\n",
    "GN 2375\n",
    "GN 2378\n",
    "GN 2380\n",
    "GO 25600-GO 26900\n",
    "GO 25600\n",
    "GO 25700\n",
    "GO 25800\n",
    "GO 25900\n",
    "GO 26100\n",
    "GO 26200\n",
    "GO 26300\n",
    "GO 26400\n",
    "GO 26500\n",
    "GT 1467-GT 1495\n",
    "GT 1467\n",
    "GT 1485\n",
    "GT 1490\"\"\".splitlines(False)\n",
    "rvk = set(rvk)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "schlagwort2 = \"\"\"Abecedarium\n",
    "Abenteuererzählung\n",
    "Abenteuerliteratur\n",
    "Abenteuerroman\n",
    "Abschiedsbrief\n",
    "Abstrakte Dichtung\n",
    "Absurder Roman\n",
    "Absurdes Drama\n",
    "Abzählreim\n",
    "Adamsspiel\n",
    "Adaption\n",
    "Adventslied\n",
    "Adventsspiel\n",
    "Agon\n",
    "Akrostichon\n",
    "Aktschluss\n",
    "Akustische Dichtung\n",
    "Albanuslegende\n",
    "Alexanderdichtung\n",
    "Allegorie\n",
    "Ammenmärchen\n",
    "Analytisches Drama\n",
    "Andachtslied\n",
    "Anekdote\n",
    "Angewandtes Theater\n",
    "Anstandsliteratur\n",
    "Antichristspiel\n",
    "Antikriegsliteratur\n",
    "Antiroman\n",
    "Anti-Utopie\n",
    "Aphorismus\n",
    "Apologie\n",
    "Apophthegma\n",
    "Arbeiterdrama\n",
    "Arbeiterliteratur\n",
    "Arbeiterlyrik\n",
    "Arbeiterroman\n",
    "Arbeitslied\n",
    "Artusepik\n",
    "Arztroman\n",
    "Äsopische Fabel\n",
    "Auftragsdichtung\n",
    "Aufzeichnung\n",
    "Auktoriales Drama\n",
    "Außereuropäische Literatur\n",
    "Ausstattungsstück\n",
    "Auswandererlied\n",
    "Autobiografie\n",
    "Autobiografische Erzählung\n",
    "Autobiografische Literatur\n",
    "Autobiografische Lyrik\n",
    "Autobiografischer Roman\n",
    "Autoethnografie\n",
    "Autorenlied\n",
    "Ballade\n",
    "Bänkelsang\n",
    "Bänkelsänger\n",
    "Bardenliteratur\n",
    "Bauerndrama\n",
    "Bauernliteratur\n",
    "Bauernroman\n",
    "Bekenntnisdichtung\n",
    "Bekenntnisroman\n",
    "Belletristische Darstellung\n",
    "Berggeistsage\n",
    "Bergmannsdichtung\n",
    "Bergmannssage\n",
    "Bericht\n",
    "Beschäftigungsbuch\n",
    "Bibeldichtung\n",
    "Bibelepik\n",
    "Biblisches Drama\n",
    "Bilderbogen\n",
    "Bilderbuch\n",
    "Bildergeschichte\n",
    "Bildungsroman\n",
    "Biografische Literatur\n",
    "Biografischer Roman\n",
    "Bispel\n",
    "Blut-und-Boden-Roman\n",
    "Bonmot\n",
    "Boulevardtheater\n",
    "Brandanlegende\n",
    "Brief\n",
    "Briefgedicht\n",
    "Briefliteratur\n",
    "Briefroman\n",
    "Buntschriftstellerei\n",
    "Bürgerliches Drama\n",
    "Bürgerliches Trauerspiel\n",
    "Burleske\n",
    "Bürowitz\n",
    "Buschballade\n",
    "Buschiade\n",
    "Büttenrede\n",
    "Charakterdrama\n",
    "Charakterstudie\n",
    "Christliche Lyrik\n",
    "Chronikalische Erzählung\n",
    "Chronikalischer Roman\n",
    "Chronogramm\n",
    "Comic\n",
    "Comicroman\n",
    "Computerdichtung\n",
    "Couplet\n",
    "Cyberpunk\n",
    "Dekastichon\n",
    "Deklamation\n",
    "Denkspruch\n",
    "Denkvers\n",
    "Descort\n",
    "Deutschordensdichtung\n",
    "Dezime\n",
    "Dialog\n",
    "Dialogroman\n",
    "Diatribe\n",
    "Diatribensatire\n",
    "Dichterdrama\n",
    "Dichtergebet\n",
    "Dichtergedicht\n",
    "Dietrichepik\n",
    "Digest\n",
    "Dinggedicht\n",
    "Dirae\n",
    "Dit\n",
    "Dithyrambus\n",
    "Dokumentarliteratur\n",
    "Dokumentarroman\n",
    "Dokumentarspiel\n",
    "Dokumentartheater\n",
    "Donquichottiade\n",
    "Doppelroman\n",
    "Dorfgeschichte\n",
    "Dorflyrik\n",
    "Drama\n",
    "Dramenzyklus\n",
    "Dramolett\n",
    "Dreikönigsspiel\n",
    "Du-Erzählung\n",
    "Eheroman\n",
    "Ehestandsliteratur\n",
    "Ehrenrede\n",
    "Einakter\n",
    "Einfache Formen\n",
    "Ekloge\n",
    "Elegie\n",
    "Emblemliteratur\n",
    "Empörerepos\n",
    "Engagierte Literatur\n",
    "Enkomion\n",
    "Ensenhamen\n",
    "Entwicklungsroman\n",
    "Epeisodion\n",
    "Epicedium\n",
    "Epigonenliteratur\n",
    "Epigramm\n",
    "Epik\n",
    "Epinikion\n",
    "Episches Theater\n",
    "Epistel\n",
    "Epitome\n",
    "Epode\n",
    "Epos\n",
    "Epyllion\n",
    "Er-Erzählung\n",
    "Erlebnisdichtung\n",
    "Erotische Erzählung\n",
    "Erotische Literatur\n",
    "Erotische Lyrik\n",
    "Erotische Novelle\n",
    "Erotischer Roman\n",
    "Erotisches Drama\n",
    "Erotisches Lied\n",
    "Erotisches Märchen\n",
    "Erzählgedicht\n",
    "Erzähllied\n",
    "Erzählung\n",
    "Erziehungsroman\n",
    "Esperpento\n",
    "Essay\n",
    "Exempel\n",
    "Exildrama\n",
    "Exilerzählung\n",
    "Exillyrik\n",
    "Exilroman\n",
    "Exodos\n",
    "Exordium\n",
    "Experimentelle Kurzgeschichte\n",
    "Experimentelle Literatur\n",
    "Experimentelle Lyrik\n",
    "Experimentelle Prosa\n",
    "Experimenteller Roman\n",
    "Fabel\n",
    "Fabelbuch\n",
    "Fablel\n",
    "Familiendrama\n",
    "Familienroman\n",
    "Familiensaga\n",
    "Fan-Fiction\n",
    "Fantastische Epik\n",
    "Fantastische Erzählung\n",
    "Fantastische Jugendliteratur\n",
    "Fantastische Kinderliteratur\n",
    "Fantastische Literatur\n",
    "Fantastische Lyrik\n",
    "Fantastischer Roman\n",
    "Farce\n",
    "Fastnachtsspiel\n",
    "Fatras\n",
    "Fatrasie\n",
    "Faustdichtung\n",
    "Fazetie\n",
    "Feengeschichte\n",
    "Feldherrnrede\n",
    "Festgedicht\n",
    "Festspiel\n",
    "Fibelvers\n",
    "Figurengedicht\n",
    "Fiktionale Darstellung\n",
    "Fiktiver Reisebericht\n",
    "Fingierter Brief\n",
    "Florilegium\n",
    "Folkevise\n",
    "Folksong\n",
    "Formelmärchen\n",
    "Fortsetzungsroman\n",
    "Fotoroman\n",
    "Frauendrama\n",
    "Frauenerzählung\n",
    "Frauenklage\n",
    "Frauenlied\n",
    "Frauenliteratur\n",
    "Frauenlyrik\n",
    "Frauenmonolog\n",
    "Frauenprosa\n",
    "Frauenroman\n",
    "Frauenwitz\n",
    "Freiheitsdichtung\n",
    "Fronleichnamsspiel\n",
    "Funkerzählung\n",
    "Fürstenspiegel\n",
    "Galante Literatur\n",
    "Galante Lyrik\n",
    "Galanter Roman\n",
    "Gaucho-Literatur\n",
    "Gebetslyrik\n",
    "Gebrauchsliteratur\n",
    "Gebrauchslyrik\n",
    "Geburtstagsgedicht\n",
    "Gedankenlyrik\n",
    "Gefangenenliteratur\n",
    "Geißlerlied\n",
    "Geistliche Epik\n",
    "Geistliche Literatur\n",
    "Geistlichenliteratur\n",
    "Geistliches Drama\n",
    "Geistliches Epos\n",
    "Geistliches Kinderlied\n",
    "Geistliches Lied\n",
    "Geistliches Tagelied\n",
    "Geistliches Volkslied\n",
    "Gelebte Literatur\n",
    "Gelegenheitsdichtung\n",
    "Gelegenheitsgedicht\n",
    "Gelehrtendichtung\n",
    "Gemäldegedicht\n",
    "Genrebild\n",
    "Geopoetik\n",
    "Geschichtsallegorie\n",
    "Geschlechtersage\n",
    "Gesellschaftslied\n",
    "Gesellschaftsroman\n",
    "Gespenstergeschichte\n",
    "Gilgameschdichtung\n",
    "Gleichnis\n",
    "Glosa\n",
    "Gnome\n",
    "Götterhymne\n",
    "Gräberpoesie\n",
    "Gralssage\n",
    "Graphzine\n",
    "Greguería\n",
    "Groteske\n",
    "Gründungssage\n",
    "Gutenachtgeschichte\n",
    "Haikai\n",
    "Haiku\n",
    "Halslösungsrätsel\n",
    "Handyroman\n",
    "Hansi\n",
    "Hanswurstiade\n",
    "Harfnerlied\n",
    "Haupttext\n",
    "Heiligenvita\n",
    "Heimatepik\n",
    "Heimatkalender\n",
    "Heimatlied\n",
    "Heimatliteratur\n",
    "Heimatlyrik\n",
    "Heimatroman\n",
    "Heldenbuch\n",
    "Heldendichtung\n",
    "Heldenepos\n",
    "Heldenlied\n",
    "Heldensage\n",
    "Herbstlied\n",
    "Herkunftssage\n",
    "Hermetische Literatur\n",
    "Heroide\n",
    "Heroisches Drama\n",
    "Heroisch-galanter Roman\n",
    "Heroldsdichtung\n",
    "Herrenwitz\n",
    "Himmelsbrief\n",
    "Hirlandalegende\n",
    "Hirtendichtung\n",
    "Hirtenlied\n",
    "Hirtenspiel\n",
    "Historie\n",
    "Historische Erzählung\n",
    "Historische Literatur\n",
    "Historische Lyrik\n",
    "Historische Novelle\n",
    "Historische Prosa\n",
    "Historische Sage\n",
    "Historischer Comic\n",
    "Historischer Essay\n",
    "Historischer Kriminalroman\n",
    "Historischer Roman\n",
    "Historisches Drama\n",
    "Historisches Epos\n",
    "Historisches Exempel\n",
    "Historisches Lied\n",
    "Historisches Volkslied\n",
    "Historisches Volksschauspiel\n",
    "Hochzeitsgedicht\n",
    "Hochzeitslied\n",
    "Höfische Epik\n",
    "Höfische Literatur\n",
    "Höfische Lyrik\n",
    "Höfisches Epos\n",
    "Horrorerzählung\n",
    "Horrorliteratur\n",
    "Horrorroman\n",
    "Hörspiel\n",
    "Hörspieltheorie\n",
    "Humanistendrama\n",
    "Humoreske\n",
    "Humoristische Kurzepik\n",
    "Humoristische Literatur\n",
    "Humoristische Lyrik\n",
    "Humoristische Prosa\n",
    "Humoristischer Roman\n",
    "Humoristisches Drama\n",
    "Hymne\n",
    "Ich-Erzählung\n",
    "Ich-Roman\n",
    "Ideendrama\n",
    "Ideenroman\n",
    "Idylle\n",
    "Illustriertenroman\n",
    "Indianerroman\n",
    "Industrieliteratur\n",
    "Interlude\n",
    "Internetliteratur\n",
    "Ironische Lobrede\n",
    "Irrenwitz\n",
    "Itinerar\n",
    "Jagdallegorie\n",
    "Jagdsage\n",
    "Jahrmarktsliteratur\n",
    "Jambendichtung\n",
    "Jesuitendichtung\n",
    "Jesuitendrama\n",
    "Jüdischer Witz\n",
    "Jugendbuch\n",
    "Jugendhörspiel\n",
    "Jugendlied\n",
    "Jugendliteratur\n",
    "Jugendlyrik\n",
    "Jugendroman\n",
    "Jugendsachliteratur\n",
    "Jugendtagebuch\n",
    "Jugendtheater\n",
    "Kalendergeschichte\n",
    "Kammerspiel\n",
    "Kärntnerlied\n",
    "Kasside\n",
    "Kasus\n",
    "Katalogvers\n",
    "Kaufmannsroman\n",
    "Kettenmärchen\n",
    "Kinderbuch\n",
    "Kinderhörspiel\n",
    "Kinderlied\n",
    "Kinderlyrik\n",
    "Kindermärchen\n",
    "Kindermund\n",
    "Kinderrätsel\n",
    "Kinderreim\n",
    "Kindersachliteratur\n",
    "Kindertheater\n",
    "Kinderwitz\n",
    "Klagelied\n",
    "Knittelvers\n",
    "Kolonialliteratur\n",
    "Kolonialroman\n",
    "Kolportageliteratur\n",
    "Kolportageroman\n",
    "Komische Erzählung\n",
    "Komische Literatur\n",
    "Komische Lyrik\n",
    "Komischer Roman\n",
    "Komisches Epos\n",
    "Kommos\n",
    "Komödie\n",
    "Königsdrama\n",
    "Konkrete Poesie\n",
    "Konversationsstück\n",
    "Kordax\n",
    "Kreuzfahrerlied\n",
    "Kreuzleich\n",
    "Kreuzzugsdichtung\n",
    "Kriegsdrama\n",
    "Kriegserzählung\n",
    "Kriegsliteratur\n",
    "Kriegslyrik\n",
    "Kriegsprosa\n",
    "Kriegsroman\n",
    "Kriminalgeschichte\n",
    "Kriminalliteratur\n",
    "Kriminalnovelle\n",
    "Kriminalroman\n",
    "Kriminalspiel\n",
    "Krippenspiel\n",
    "Kunstlegende\n",
    "Künstlerdrama\n",
    "Künstlererzählung\n",
    "Künstlernovelle\n",
    "Künstlerroman\n",
    "Kunstmärchen\n",
    "Kurzepik\n",
    "Kürzestgeschichte\n",
    "Kurzgeschichte\n",
    "Kurzroman\n",
    "Landserheft\n",
    "Langgedicht\n",
    "Lapidarium\n",
    "Lauda\n",
    "Laudatio\n",
    "Lautgedicht\n",
    "Lebenslehre\n",
    "Legendar\n",
    "Legende\n",
    "Legendenepos\n",
    "Legendenlied\n",
    "Legendenspiel\n",
    "Lehrdichtung\n",
    "Lehrgedicht\n",
    "Lehrstück\n",
    "Leich\n",
    "Leichenrede\n",
    "Leichenspiel\n",
    "Lesedrama\n",
    "Lexikon-Roman\n",
    "Libretto\n",
    "Liebesdichtung\n",
    "Liebesdrama\n",
    "Liebeselegie\n",
    "Liebesgeschichte\n",
    "Liebesklage\n",
    "Liebeslied\n",
    "Liebeslyrik\n",
    "Liebesroman\n",
    "Lied\n",
    "Limerick\n",
    "Literatenmalerei\n",
    "Literaturbrief\n",
    "Literatursatire\n",
    "Loblied\n",
    "Locrinesage\n",
    "Lokalstück\n",
    "Lubok\n",
    "Lügendichtung\n",
    "Lügenerzählung\n",
    "Lunar\n",
    "Lyrics\n",
    "Lyrik\n",
    "Lyrikzyklus\n",
    "Lyrischer Roman\n",
    "Lyrisches Drama\n",
    "Madrigal\n",
    "Madrigalkomödie\n",
    "Maispiel\n",
    "Makkaronische Dichtung\n",
    "Malerroman\n",
    "Mandarinenten- und Schmetterlingsliteratur\n",
    "Manga\n",
    "Mantel- und Degenstück\n",
    "Märchen\n",
    "Märchendrama\n",
    "Märchensaga\n",
    "Märe\n",
    "Mariendichtung\n",
    "Marienklage\n",
    "Marienlied\n",
    "Marienlyrik\n",
    "Maritimes Lied\n",
    "Märtyrerdrama\n",
    "Märtyrerlied\n",
    "Maxime\n",
    "Meeresdichtung\n",
    "Meistersang\n",
    "Melik\n",
    "Melodram\n",
    "Melodrama\n",
    "Mesostichon\n",
    "Metalyrik\n",
    "Metaphrase\n",
    "Metapoetik\n",
    "Metatheater\n",
    "Militärstück\n",
    "Minneallegorie\n",
    "Minnebrief\n",
    "Minneleich\n",
    "Minnesang\n",
    "Mirakelspiel\n",
    "Mise en abyme\n",
    "Miszellanliteratur\n",
    "Moderne Sage\n",
    "Mondwahrsagetext\n",
    "Monodrama\n",
    "Monogatari\n",
    "Monologerzählung\n",
    "Moralische Erzählung\n",
    "Moralistik\n",
    "Moralität\n",
    "Moralsatire\n",
    "Moritat\n",
    "Münchhausiade\n",
    "Mundartdrama\n",
    "Mundarterzählung\n",
    "Mundartliteratur\n",
    "Mundartlyrik\n",
    "Mündliche Erzählung\n",
    "Mysterienspiel\n",
    "Mystery\n",
    "Nachruf\n",
    "Nachspiel\n",
    "Nachtstück\n",
    "Namenssage\n",
    "Nänie\n",
    "Narrenliteratur\n",
    "Nartendichtung\n",
    "Natureingang\n",
    "Naturlyrik\n",
    "Natursage\n",
    "Nebentext\n",
    "Neidhartspiel\n",
    "Neues chilenisches Lied\n",
    "Neujahrslied\n",
    "Nichtfiktionale Prosa\n",
    "Nikolausspiel\n",
    "Nonnenvita\n",
    "Nonsense-Literatur\n",
    "Novelle\n",
    "Novellette\n",
    "Ode\n",
    "Offenbarungsliteratur\n",
    "Offener Brief\n",
    "Okzidentalisierende Literatur\n",
    "Ordensliteratur\n",
    "Ortssage\n",
    "Ossianische Dichtung\n",
    "Osterfeier\n",
    "Osterlied\n",
    "Ostermärlein\n",
    "Osterspiel\n",
    "Palinodie\n",
    "Panegyrikus\n",
    "Panoramaroman\n",
    "Parabel\n",
    "Paradiesspiel\n",
    "Paradoxographie\n",
    "Parahistorischer Roman\n",
    "Parodie\n",
    "Partimen\n",
    "Paso\n",
    "Pasquill\n",
    "Passionar\n",
    "Passionslied\n",
    "Passionsspiel\n",
    "Pastorelle\n",
    "Patriotische Lyrik\n",
    "Patriotisches Drama\n",
    "Patriotisches Lied\n",
    "Periegesis\n",
    "Perioche\n",
    "Periplus\n",
    "Philosophische Erzählung\n",
    "Philosophische Lyrik\n",
    "Philosophischer Roman\n",
    "Philosophisches Drama\n",
    "Phlyaken\n",
    "Physiologie\n",
    "Pindarische Ode\n",
    "Poem\n",
    "Poésie pure\n",
    "Poetologische Lyrik\n",
    "Politische Literatur\n",
    "Politische Lyrik\n",
    "Politische Satire\n",
    "Politischer Essay\n",
    "Politischer Roman\n",
    "Politisches Lied\n",
    "Politisches Theater\n",
    "Popliteratur\n",
    "Posse\n",
    "Postille\n",
    "Postkoloniale Literatur\n",
    "Praetexta\n",
    "Preisgedicht\n",
    "Preislied\n",
    "Priamel\n",
    "Problemdrama\n",
    "Professorenroman\n",
    "Propemptikon\n",
    "Prosa\n",
    "Prosagedicht\n",
    "Prosarhythmus\n",
    "Prosaschwank\n",
    "Protreptik\n",
    "Proverbe dramatique\n",
    "Prozessionsspiel\n",
    "Psalmendichtung\n",
    "Psychologischer Roman\n",
    "Purimspiel\n",
    "Rachetragödie\n",
    "Radio-Essay\n",
    "Rat der Vögel\n",
    "Rätsel\n",
    "Räuberroman\n",
    "Rechtssprichwort\n",
    "Reformationsdrama\n",
    "Regionalkrimi\n",
    "Regionalroman\n",
    "Reimbibel\n",
    "Reimchronik\n",
    "Reimdichtung\n",
    "Reimgebet\n",
    "Reimpredigt\n",
    "Reimprosa\n",
    "Reimrede\n",
    "Reimvers\n",
    "Reimvorrede\n",
    "Reisegedicht\n",
    "Reiseliteratur\n",
    "Reiseroman\n",
    "Reiterlied\n",
    "Reizrede\n",
    "Religiöse Lyrik\n",
    "Religiöser Bilderbogen\n",
    "Religiöser Kalender\n",
    "Religiöses Drama\n",
    "Religiöses Lied\n",
    "Report\n",
    "Reportageliteratur\n",
    "Résistanceliteratur\n",
    "Revolutionsdichtung\n",
    "Revolutionsdrama\n",
    "Revolutionslied\n",
    "Revolutionslyrik\n",
    "Revolutionsroman\n",
    "Rhēsis\n",
    "Richtspruch\n",
    "Ritornell\n",
    "Ritterdrama\n",
    "Ritterepos\n",
    "Ritterroman\n",
    "Rittersage\n",
    "Robinsonade\n",
    "Rocksong\n",
    "Rollengedicht\n",
    "Roman\n",
    "Roman noir\n",
    "Romanheft\n",
    "Romanze\n",
    "Römerdrama\n",
    "Rondeau\n",
    "Rondel\n",
    "Rührstück\n",
    "Runengedicht\n",
    "Runengesang\n",
    "Runenlied\n",
    "Ruralismus\n",
    "Sachcomic\n",
    "Sage\n",
    "Sangspruch\n",
    "Satire\n",
    "Satirische Erzählung\n",
    "Satirische Lyrik\n",
    "Satirische Prosa\n",
    "Satirischer Roman\n",
    "Satirisches Märchen\n",
    "Saturnier\n",
    "Satyrspiel\n",
    "Schachzabelbuch\n",
    "Schäferroman\n",
    "Schäferspiel\n",
    "Scharade\n",
    "Schatzgräbersage\n",
    "Schauerdrama\n",
    "Schauererzählung\n",
    "Schauerliteratur\n",
    "Schauerroman\n",
    "Schelmengeschichte\n",
    "Schelmenroman\n",
    "Scheltgedicht\n",
    "Scheltrede\n",
    "Scheltspruch\n",
    "Scherz\n",
    "Scherzfrage\n",
    "Scherzgedicht\n",
    "Scherzlied\n",
    "Scherzrede\n",
    "Scherzspruch\n",
    "Schicksalstragödie\n",
    "Schiffermärchen\n",
    "Schlagertext\n",
    "Schlemmerlied\n",
    "Schlüsselliteratur\n",
    "Schlüsselroman\n",
    "Schnaderhüpferl\n",
    "Schreckmärchen\n",
    "Schuldichtung\n",
    "Schuldrama\n",
    "Schülerwitz\n",
    "Schundroman\n",
    "Schüttelreim\n",
    "Schwank\n",
    "Schwankballade\n",
    "Schwankerzählung\n",
    "Schwanklied\n",
    "Schwankmärchen\n",
    "Schwankroman\n",
    "Science-Fiction-Literatur\n",
    "Seeroman\n",
    "Sensationsroman\n",
    "Sentenz\n",
    "Sentimentalität\n",
    "Sermon joyeux\n",
    "Siedlerroman\n",
    "Singvers\n",
    "Sinnspruch\n",
    "Sittenroman\n",
    "Sittenstück\n",
    "Situationskomödie\n",
    "Skaldendichtung\n",
    "Skas\n",
    "Sketch\n",
    "Skizze\n",
    "Slam Poetry\n",
    "Soldatenlied\n",
    "Soldatenwitz\n",
    "Sonett\n",
    "Song\n",
    "Sotte chanson\n",
    "Sottie\n",
    "Soziale Lyrik\n",
    "Soziale Novelle\n",
    "Sozialer Roman\n",
    "Soziales Drama\n",
    "Soziales Märchen\n",
    "Spiegel\n",
    "Spielbuch\n",
    "Spiellied\n",
    "Spielmannsdichtung\n",
    "Spielmannsepos\n",
    "Spionagegeschichte\n",
    "Spionageroman\n",
    "Spottgedicht\n",
    "Spottlied\n",
    "Sprechblase\n",
    "Sprechgesang\n",
    "Sprichwort\n",
    "Spruch\n",
    "Spruchdichtung\n",
    "Staatsroman\n",
    "Stabreimdichtung\n",
    "Stadtbeschreibung\n",
    "Städtegedicht\n",
    "Stammessage\n",
    "Ständesatire\n",
    "Standrede\n",
    "Stasimon\n",
    "Stationendrama\n",
    "Stegreifdichtung\n",
    "Stegreifkomödie\n",
    "Sternsage\n",
    "Stimmungsbild\n",
    "Straßenballade\n",
    "Streitgedicht\n",
    "Streitgespräch\n",
    "Struwwelpetriade\n",
    "Studentenlied\n",
    "Sündenklage\n",
    "Symposionliteratur\n",
    "Tagebuch\n",
    "Tagebuchroman\n",
    "Tagelied\n",
    "Tannhäusersage\n",
    "Terzine\n",
    "Tetralogie\n",
    "Teufelsliteratur\n",
    "Teufelssage\n",
    "Theaterstück\n",
    "Thesenroman\n",
    "Thesenstück\n",
    "Threnos\n",
    "Thriller\n",
    "Tierdichtung\n",
    "Tierepos\n",
    "Tiererzählung\n",
    "Tierlyrik\n",
    "Tiermärchen\n",
    "Tiersage\n",
    "Tierschwank\n",
    "Tierwitz\n",
    "Tischgespräch\n",
    "Tischzucht\n",
    "Totengespräch\n",
    "Totenklage\n",
    "Tragikomödie\n",
    "Tragödie\n",
    "Trauerbrief\n",
    "Trauerrede\n",
    "Traumallegorie\n",
    "Traumdichtung\n",
    "Traumsatire\n",
    "Traumvision\n",
    "Travestie\n",
    "Trilogie\n",
    "Trinklied\n",
    "Trinkspruch\n",
    "Tristanepik\n",
    "Trivialdrama\n",
    "Trivialer Frauenroman\n",
    "Trivialliteratur\n",
    "Trivialroman\n",
    "Trojaroman\n",
    "Trostbrief\n",
    "Trostschrift\n",
    "Troubadourlyrik\n",
    "Tugendspiegel\n",
    "Türkenlied\n",
    "Typenkomödie\n",
    "Unterhaltungsdrama\n",
    "Unterhaltungsliteratur\n",
    "Unterhaltungsroman\n",
    "Ursprungssage\n",
    "Vagantendichtung\n",
    "Varronische Satire\n",
    "Versdichtung\n",
    "Versdrama\n",
    "Versepik\n",
    "Verserzählung\n",
    "Versinschrift\n",
    "Verskomödie\n",
    "Verslegende\n",
    "Versmärchen\n",
    "Versroman\n",
    "Verssatire\n",
    "Versschwank\n",
    "Verstragödie\n",
    "Verzauberung\n",
    "Vierzeiler\n",
    "Visuelle Poesie\n",
    "Vita\n",
    "Volksballade\n",
    "Volksbuch\n",
    "Volksepos\n",
    "Volkserzählung\n",
    "Volksfestspiel\n",
    "Volkslied\n",
    "Volksliedforschung\n",
    "Volkslyrik\n",
    "Volksschauspiel\n",
    "Volksstück\n",
    "Wahlspruch\n",
    "Wallfahrtsbericht\n",
    "Wanderlied\n",
    "Wechsel\n",
    "Weihnachtserzählung\n",
    "Weihnachtslied\n",
    "Weihnachtsspiel\n",
    "Wellerismus\n",
    "Weltchronik\n",
    "Weltgerichtsspiel\n",
    "Weltliche Lyrik\n",
    "Weltliches Drama\n",
    "Werbungslied\n",
    "Wertheriade\n",
    "Westernliteratur\n",
    "Westernroman\n",
    "Widmungsgedicht\n",
    "Wiegenlied\n",
    "Wiener Volkstheater\n",
    "Witz\n",
    "Zauberliteratur\n",
    "Zaubermärchen\n",
    "Zaubersage\n",
    "Zauberspruch\n",
    "Zauberstück\n",
    "Zeitgedicht\n",
    "Zeitroman\n",
    "Zeitstück\n",
    "Zeitungslied\n",
    "Zote\n",
    "Zukunftsroman\n",
    "Zweiakter\n",
    "Zyklenroman\n",
    "Zyklus\"\"\".lower().split()\n",
    "schlagwort = set(schlagwort1 + schlagwort2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "soll_nicht_655 = \"\"\"Altkarte\n",
    "Amtliche Publikation\n",
    "Anleitung\n",
    "Antiquariatskatalog\n",
    "Anzeigenblatt\n",
    "Atlas\n",
    "Aufgabensammlung\n",
    "Auktionskatalog\n",
    "Ausstellungskatalog\n",
    "Backbuch\n",
    "Bericht\n",
    "Bestimmungsbuch\n",
    "Bibliografie\n",
    "Bild\n",
    "Bildband\n",
    "Bilderbogen\n",
    "Bilderbuch\n",
    "Bildnis\n",
    "Bildwörterbuch\n",
    "Blindendruck\n",
    "Briefsammlung\n",
    "Checkliste\n",
    "Datenbank\n",
    "Datensammlung\n",
    "Diagramm\n",
    "Diskografie\n",
    "Einblattdruck\n",
    "Einführung\n",
    "Entscheidungssammlung\n",
    "Enzyklopädie\n",
    "Fachkunde\n",
    "Fahrplan\n",
    "Fallsammlung\n",
    "Festschrift\n",
    "Fallstudiensammlung\n",
    "Festschrift\n",
    "Film\n",
    "Filmografie\n",
    "Formelsammlung\n",
    "Formularsammlung\n",
    "Forschungsbericht\n",
    "Forschungsdaten\n",
    "Fotografie\n",
    "Führer\n",
    "Fundstellenverzeichnis\n",
    "Genealogische Tafel\n",
    "Globus\n",
    "Graphzine\n",
    "Handschrift\n",
    "Haushaltsplan\n",
    "Hochschulschrift\n",
    "Inventar\n",
    "Jugendsachbuch\n",
    "Kalender\n",
    "Karte\n",
    "Katalog\n",
    "Kindersachbuch\n",
    "Kochbuch\n",
    "Konferenzschrift\n",
    "Konkordanz\n",
    "Kunstführer\n",
    "Lehrbuch\n",
    "Lehrerhandbuch\n",
    "Lehrmittel\n",
    "Lehrplan\n",
    "Literaturbericht\n",
    "Loseblattsammlung\n",
    "Mehrsprachiges\n",
    "Wörterbuch\n",
    "Mitgliederverzeichnis\n",
    "Modell\n",
    "Monografische Reihe\n",
    "Musikhandschrift\n",
    "Nachruf\n",
    "Norm\n",
    "Ortsverzeichnis\n",
    "Papyrus\n",
    "Patentschrift\n",
    "Plakat\n",
    "Plan\n",
    "Postkarte\n",
    "Praktikum\n",
    "Predigthilfe\n",
    "Pressestimme\n",
    "Programmheft\n",
    "Puzzle\n",
    "Quelle\n",
    "Ratgeber\n",
    "Rede\n",
    "Referateorgan\n",
    "Regest\n",
    "Reisebericht\n",
    "Reportagensammlung\n",
    "Rezension\n",
    "Richtlinie\n",
    "Röntgenbild\n",
    "Rückläufiges Wörterbuch\n",
    "Sachbilderbuch\n",
    "Satzung\n",
    "Schematismus\n",
    "Schulbuch\n",
    "Schulprogramm\n",
    "Schulbuch\n",
    "Software\n",
    "Spiel\n",
    "Sprachatlas\n",
    "Sprachführer\n",
    "Stadtplan\n",
    "Statistik\n",
    "Tabelle\n",
    "Tafel\n",
    "Technische Zeichnung\n",
    "Telefonbuch\n",
    "Testmaterial\n",
    "Übungssammlung\n",
    "Umfrage\n",
    "Unterrichtseinheit\n",
    "Urkunde\n",
    "Verkaufskatalog\n",
    "Verzeichnis\n",
    "Vorlesungsverzeichnis\n",
    "Weblog\n",
    "Website\n",
    "Weltkarte\n",
    "Werkverzeichnis\n",
    "Zeitschrift\n",
    "Werkzeitschrift\n",
    "Wörterbuch\n",
    "Zeichnung\n",
    "Zeitschrift\n",
    "Zeittafel\n",
    "Zitatensammlung\"\"\".lower().split()\n",
    "soll_nicht_655 = set(soll_nicht_655)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sifting of full MARC-data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "file_count_counter = 0\n",
    "count_records = 0\n",
    "count_books = 0\n",
    "count_fictions = 0\n",
    "count_trl = 0\n",
    "count_fictions_minus_trl = 0\n",
    "total_count = 0\n",
    "seven = ''\n",
    "books = []\n",
    "\n",
    "\n",
    "for filename in tqdm(files_auto):\n",
    "    file_count_counter = 0\n",
    "    with open(filename, 'rb') as fh:\n",
    "        reader = MARCReader(fh, to_unicode=True, force_utf8=True, utf8_handling='ignore')\n",
    "        for record in reader:   \n",
    "            file_count_counter += 1  \n",
    "            count_records += 1\n",
    "\n",
    "            # only books (controlfield 007), only language material (leader 6), no periodicals (leader 7) and no extra-records for multi-volume books (leader 19)     \n",
    "            try:\n",
    "                seven = str.lower(str(record.get_fields('007')[0]))\n",
    "            except:\n",
    "                seven = '-------------'\n",
    "                pass\n",
    "            leader = record.leader\n",
    "            if (seven[6] == \"t\") and leader[6] == \"a\" and leader[7] != \"s\" and leader[19] != \"c\":\n",
    "                count_books += 1\n",
    "\n",
    "                ### getting essential fields ###\n",
    "                try:\n",
    "                    two_hundred_fortyfive = str.lower(str(record.get_fields('245')[0]['a'])) # Schriftenreihe\n",
    "                    treffer_245 = []\n",
    "                    [treffer_245.append(value) for value in soll_nicht_245 if value in two_hundred_fortyfive]\n",
    "                    if len(treffer_245) > 0:\n",
    "                        continue\n",
    "                except:\n",
    "                    pass\n",
    "                try:\n",
    "                    six_hundred_fiftyfive = record.get_fields('655')[0]['a'] # Art des Inhalts\n",
    "                    if six_hundred_fiftyfive.lower().strip() not in soll_nicht_655:\n",
    "                        six_hundred_fiftyfive = None\n",
    "                    else:\n",
    "                        continue\n",
    "                except:\n",
    "                    pass\n",
    "                try:\n",
    "                    five_hundred_two = record.get_fields('502')[0]['a'] # Dissertationen\n",
    "                    if len(five_hundred_two) > 0: \n",
    "                        continue                    \n",
    "                except:\n",
    "                    pass\n",
    "                forty_one = record.get_fields('041')\n",
    "                seven_hundred = record.get_fields('700')\n",
    "                two_hundred_forty_five = record.get_fields('245')\n",
    "                try:\n",
    "                    seven_hundred_four = str.lower(str(record.get_fields('700')[0]['4']))\n",
    "                except:\n",
    "                    seven_hundred_four = 'none'\n",
    "                    pass\n",
    "                try:\n",
    "                    seven_hundred_t = str.lower(str(record.get_fields('700')[0]['t']))\n",
    "                except:\n",
    "                    seven_hundred_t = 'none'\n",
    "                    pass\n",
    "                try:\n",
    "                    seven_hundred_g = str.lower(str(record.get_fields('700')[0]['g']))\n",
    "                except:\n",
    "                    seven_hundred_g = 'none'\n",
    "                    pass\n",
    "                try:\n",
    "                    seven_hundred_four1 = str.lower(str(record.get_fields('700')[1]['4']))\n",
    "                except:\n",
    "                    seven_hundred_four1 = 'none'\n",
    "                    pass\n",
    "                try:\n",
    "                    seven_hundred_t1 = str.lower(str(record.get_fields('700')[1]['t']))\n",
    "                except:\n",
    "                    seven_hundred_t1 = 'none'\n",
    "                    pass\n",
    "                try:\n",
    "                    seven_hundred_g1 = str.lower(str(record.get_fields('700')[1]['g1']))\n",
    "                except:\n",
    "                    seven_hundred_g1 = 'none'\n",
    "                try:\n",
    "                    seven_hundred_four2 = str.lower(str(record.get_fields('700')[2]['4']))\n",
    "                except:\n",
    "                    seven_hundred_four2 = 'none'\n",
    "                    pass\n",
    "                try:\n",
    "                    seven_hundred_t2 = str.lower(str(record.get_fields('700')[2]['t']))\n",
    "                except:\n",
    "                    seven_hundred_t2 = 'none'\n",
    "                    pass\n",
    "                try:\n",
    "                    seven_hundred_g2 = str.lower(str(record.get_fields('700')[2]['g1']))\n",
    "                except:\n",
    "                    seven_hundred_g2 = 'none'   \n",
    "                try:\n",
    "                    two_hundred_forty_three = str.lower(str(record.get_fields('243')[0]['l']))\n",
    "                except:\n",
    "                    two_hundred_forty_three = 'none'\n",
    "                    pass\n",
    "                try:\n",
    "                    five_hundred_a = str.lower(str(record.get_fields('500')[0]['a']))\n",
    "                except:\n",
    "                    five_hundred_a = ''\n",
    "                    pass\n",
    "                try:\n",
    "                    two_hundred_forty_five_b = str.lower(record.get_fields('245')[0]['b'])\n",
    "                except:\n",
    "                    two_hundred_forty_five_b = ''\n",
    "                    pass\n",
    "                try:\n",
    "                    two_hundred_forty_five_c = str.lower(record.get_fields('245')[0]['c'])\n",
    "                except:\n",
    "                    two_hundred_forty_five_c = ''\n",
    "                    pass\n",
    "                try:\n",
    "                    two_hundred_forty_nine_a = str.lower(record.get_fields('249')[0]['a'])\n",
    "                except:\n",
    "                    two_hundred_forty_nine_a = ''\n",
    "                    pass\n",
    "                try:\n",
    "                    two_hundred_forty_nine_b = str.lower(record.get_fields('249')[0]['b'])\n",
    "                except:\n",
    "                    two_hundred_forty_nine_b = ''\n",
    "                    pass\n",
    "                try:\n",
    "                    two_hundred_forty_nine_c = str.lower(record.get_fields('249')[0]['c'])\n",
    "                except:\n",
    "                    two_hundred_forty_nine_c = ''\n",
    "                    pass\n",
    "                try:\n",
    "                    hundred_thirty = str.lower(record.get_fields('130')[0]['a']) # Übersetzungen\n",
    "                except:\n",
    "                    hundred_thirty = ''\n",
    "                    pass\n",
    "\n",
    "\n",
    "                # CHECKING FOR FICTIONS\n",
    "                genre_values1 = record.get_fields('084')\n",
    "                genre_values2 = record.get_fields('083')\n",
    "                genre_values3 = record.get_fields('082')\n",
    "                genre_values4 = record.get_fields('050') # nur für LOC-Sachgruppen\n",
    "                genre_values5 = record.get_fields('936') # nur für Basisklassifikation \n",
    "                genre_values6 = record.get_fields('689') # für Schlagwörter\n",
    "                genre_values7 = record.get_fields('655') # für Schlagwörter???\n",
    "                \n",
    "                gvs = []\n",
    "                gvs4 = []\n",
    "                gvs5 = []\n",
    "                gvs6 = []\n",
    "                gvs7 = []\n",
    "                gvs_komma_gesplittet = []\n",
    "                gvs5_komma_gesplittet = []\n",
    "                trefferliste = []      \n",
    "                                \n",
    "                for v in itertools.chain(genre_values1, genre_values2, genre_values3):\n",
    "                    gvs.extend(v.value().split())\n",
    "                    gvs_komma_gesplittet.extend(re.split(';|,', v.value()))\n",
    "                for v in itertools.chain(genre_values4):\n",
    "                    gvs4.extend(v.value().split())\n",
    "                for v in itertools.chain(genre_values5):\n",
    "                    gvs5.extend(v.value().split())\n",
    "                    gvs5_komma_gesplittet.extend(re.split(';|,', v.value()))\n",
    "                for v in itertools.chain(genre_values6):\n",
    "                    gvs6.extend(v.value().lower().split())\n",
    "                for v in itertools.chain(genre_values7):\n",
    "                    gvs7.extend(v.value().lower().split())\n",
    "                \n",
    "                #für Sachgruppen mit Zahlen\n",
    "                trefferliste = [sachgruppe for sachgruppe in itertools.chain(duisburg, kab) for value in gvs if sachgruppe in value]\n",
    "                \n",
    "                #für RVK\n",
    "                [trefferliste.append(sachgruppe) for sachgruppe in itertools.chain(rvk) for value in gvs5_komma_gesplittet if sachgruppe in value]\n",
    "                \n",
    "                #für basisklassifikation\n",
    "                [trefferliste.append(value) for sachgruppe in itertools.chain(basiskl) for value in gvs5 if sachgruppe in value and value not in soll_nicht_basiskl] \n",
    "\n",
    "                #für Sachgruppen mit Buchstaben (Vergleich ganzer Werte)\n",
    "                [trefferliste.append(value) for value in gvs if value in asb]\n",
    "                \n",
    "                # für ddc (beginnt mit ...)\n",
    "                #[trefferliste.append(value) for sachgruppe in itertools.chain(ddc) for value in gvs if value == sachgruppe or value.startswith(sachgruppe + \".\") or value.startswith(sachgruppe + \"/\")]\n",
    "                \n",
    "                #für Loc\n",
    "                [trefferliste.append(value) for sachgruppe in itertools.chain(loc) for value in gvs4 if sachgruppe in value]\n",
    "                \n",
    "                #für sfb\n",
    "                [trefferliste.append(value) for sachgruppe in itertools.chain(sfb) for value in gvs_komma_gesplittet if value.startswith(sachgruppe)]\n",
    "                \n",
    "                \n",
    "                #für Schlagworte (wenn man \"deutsch\" als Schlagwort weglässt bekommt man ca. 1/3 mehr Treffer aber auch viel Sekundärliteratur)\n",
    "                [trefferliste.append(value) for sachgruppe in itertools.chain(schlagwort) for value in gvs6 if sachgruppe == value and \"deutsch\" in gvs6 and sachgruppe not in trefferliste]\n",
    "\n",
    "                #für alte Drucke\n",
    "                [trefferliste.append(value) for sachgruppe in itertools.chain(alteDrucke) for value in gvs7 if sachgruppe == value]\n",
    "                \n",
    "                #für DNB\n",
    "                if '08a' in gvs and 'B' in gvs:\n",
    "                    trefferliste.extend([\"08a\", \"B\"])\n",
    "                elif '59' in gvs:\n",
    "                    for v in gvs_komma_gesplittet:\n",
    "                        if '59' in v:\n",
    "                            pos = v.find('59') # get position within string\n",
    "                            if pos > 2 and v[pos - 2].isalpha() and v[pos - 2].isupper():\n",
    "                                pass\n",
    "                            else:\n",
    "                                trefferliste.append(\"59\")\n",
    "                        else:\n",
    "                            pass\n",
    "                elif '2303' in gvs:\n",
    "                    for v in gvs_komma_gesplittet:\n",
    "                        if '59' in v:\n",
    "                            pos = v.find('59') # get position within string\n",
    "                            if pos > 2 and v[pos - 2].isalpha() and v[pos - 2].isupper():\n",
    "                                print(\"Großbuchstabe vor 2303 gefunden:\", v)\n",
    "                            else:\n",
    "                                trefferliste.append(\"2303\")\n",
    "                        else:\n",
    "                            pass    \n",
    "                elif '830' in gvs and 'B' in gvs:\n",
    "                    trefferliste.extend([\"830\", \"B\"])\n",
    "                elif '830' in gvs and 'K' in gvs:\n",
    "                    trefferliste.extend([\"830\", \"K\"])\n",
    "                else:\n",
    "                    pass\n",
    "                \n",
    "                if len(trefferliste) > 0: \n",
    "                    pass\n",
    "                else:\n",
    "                    continue\n",
    "               \n",
    "                count_fictions +=1\n",
    "\n",
    "                ### CHECKING FOR TRANSLATIONS AND NON-GERMAN TITLES\n",
    "\n",
    "                # I. books without language code\n",
    "                if len(forty_one) == 0:\n",
    "                    \n",
    "                    # determine language of title\n",
    "                    lang = ''\n",
    "                    title = ''\n",
    "                    subtitle = ''\n",
    "                    try:\n",
    "                        title = record.get_fields('245')[0]['a']\n",
    "                    except:\n",
    "                           continue\n",
    "                    try:\n",
    "                        subtitle = record.get_fields('245')[0]['b']\n",
    "                    except:\n",
    "                        pass\n",
    "                      \n",
    "                    if subtitle is None:\n",
    "                        subtitle = ''\n",
    "                    title_total = title + '. ' + subtitle\n",
    "                                                       \n",
    "                    try:\n",
    "                        result = detectlanguage.detect(title_total)[0]\n",
    "                    except:\n",
    "                        continue\n",
    "                        \n",
    "                    if result[\"language\"] != 'de' and result[\"isReliable\"] == True:\n",
    "                        continue\n",
    "                    else:\n",
    "                        pass\n",
    "\n",
    "                    # no-translations using field 700, 245, 243 and 249 \n",
    "                    if seven_hundred_four == 'trl' or \\\n",
    "                        (seven_hundred_t != \"none\" and len(re.findall(pattern500a, five_hundred_a)) == 0) or \\\n",
    "                        seven_hundred_four1 == 'trl' or \\\n",
    "                        (seven_hundred_t1 != \"none\" and len(re.findall(pattern500a, five_hundred_a)) == 0) or \\\n",
    "                        seven_hundred_four2 == 'trl' or \\\n",
    "                        (seven_hundred_t2 != \"none\" and len(re.findall(pattern500a, five_hundred_a)) == 0):\n",
    "                        count_trl += 1\n",
    "                        continue\n",
    "                    elif (len(re.findall(pattern245, two_hundred_forty_five_b)) > 0 and len(re.findall(pattern245_2, two_hundred_forty_five_b)) == 0) or \\\n",
    "                            (len(re.findall(pattern245, two_hundred_forty_five_c)) > 0 and len(re.findall(pattern245_2, two_hundred_forty_five_b)) == 0) or \\\n",
    "                            two_hundred_forty_three != 'none' or \\\n",
    "                            (len(re.findall(pattern245, two_hundred_forty_nine_a)) > 0 and len(re.findall(pattern245_2, two_hundred_forty_nine_a)) == 0) or \\\n",
    "                            (len(re.findall(pattern245, two_hundred_forty_nine_b)) > 0 and len(re.findall(pattern245_2, two_hundred_forty_nine_b)) == 0) or \\\n",
    "                            (len(re.findall(pattern245, two_hundred_forty_nine_c)) > 0 and len(re.findall(pattern245_2, two_hundred_forty_nine_c)) == 0): \n",
    "                            count_trl += 1 \n",
    "                            continue\n",
    "                    else:\n",
    "                        pass\n",
    "\n",
    "                    books.append(record)\n",
    "                    count_fictions_minus_trl += 1\n",
    "\n",
    "                # II. books with language code\n",
    "                elif len(forty_one) > 0 and forty_one[0]['h'] == None and forty_one[0]['a'] == 'ger':\n",
    "\n",
    "\n",
    "                    # no-translations using field 700, 245, 243 and 249\n",
    "                    if seven_hundred_four == 'trl' or \\\n",
    "                        (seven_hundred_t != \"none\" and len(re.findall(pattern500a, five_hundred_a)) == 0) or \\\n",
    "                        seven_hundred_four1 == 'trl' or \\\n",
    "                        (seven_hundred_t1 != \"none\" and len(re.findall(pattern500a, five_hundred_a)) == 0) or \\\n",
    "                        seven_hundred_four2 == 'trl' or \\\n",
    "                        (seven_hundred_t2 != \"none\" and len(re.findall(pattern500a, five_hundred_a)) == 0):\n",
    "                        count_trl += 1\n",
    "                        continue\n",
    "                    elif (len(re.findall(pattern245, two_hundred_forty_five_b)) > 0 and len(re.findall(pattern245_2, two_hundred_forty_five_b)) == 0) or \\\n",
    "                            (len(re.findall(pattern245, two_hundred_forty_five_c)) > 0 and len(re.findall(pattern245_2, two_hundred_forty_five_b)) == 0) or \\\n",
    "                            two_hundred_forty_three != 'none' or \\\n",
    "                            (len(re.findall(pattern245, two_hundred_forty_nine_a)) > 0 and len(re.findall(pattern245_2, two_hundred_forty_nine_a)) == 0) or \\\n",
    "                            (len(re.findall(pattern245, two_hundred_forty_nine_b)) > 0 and len(re.findall(pattern245_2, two_hundred_forty_nine_b)) == 0) or \\\n",
    "                            (len(re.findall(pattern245, two_hundred_forty_nine_c)) > 0 and len(re.findall(pattern245_2, two_hundred_forty_nine_c)) == 0): \n",
    "                            count_trl += 1 \n",
    "                            continue\n",
    "                    else:\n",
    "                        pass\n",
    "                    \n",
    "                    books.append(record)\n",
    "                    count_fictions_minus_trl += 1\n",
    "\n",
    "                total_count += 1\n",
    "            #if file_count_counter > 10000:\n",
    "                #break\n",
    "\n",
    "print('{} of {} total records were books (no e-books, no periodicals)'.format(count_books, count_records))        \n",
    "print('{} of {} books were fictions (= Schöne Literatur)'.format(count_fictions, count_books))\n",
    "print('{} of {} fictions were not translations and kept for further analysis'.format(count_fictions_minus_trl, count_fictions))\n",
    "print('{} of {} fictions were marked translations in fields 041, 700, 243 or 245 and excluded'.format(count_trl, count_fictions))\n",
    "\n",
    "filehandler = open('books.pkl', 'wb')\n",
    "pickle.dump(books, filehandler, pickle.HIGHEST_PROTOCOL)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "filehandler = open('books.pkl', 'rb')\n",
    "books = pickle.load(filehandler)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for_csv = [get_info(x) for x in books]\n",
    "import csv\n",
    "with open('all_fictions.csv', 'w', encoding='utf8') as output_file:\n",
    "    dict_writer = csv.DictWriter(output_file, delimiter=';', lineterminator='\\n', fieldnames=['PPN','author', 'title', 'subtitle', 'edition', 'date', 'genre', 'date', 'location', 'publishing-house', 'pages', 'genre-by-librarian', 'summary'])\n",
    "    dict_writer.writeheader()\n",
    "    dict_writer.writerows(for_csv)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Part 2: Remove everything that isn't first edition"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(\"Höhere Auflagen entfernen...\")\n",
    "sifted_books = [] \n",
    "for b in books:\n",
    "        \n",
    "    try:\n",
    "        desc = b.get_fields('250')[0]['a']\n",
    "    except:\n",
    "        sifted_books.append(b)\n",
    "        continue\n",
    "\n",
    "    pattern = re.compile(r'([Nn]ova|[Nn]ouv|[Bb]earb|Gek|[Ee]rw|[Ff]aks|[Ss]chul|[Mm]onumental|[Ff]eldpost|[Bb]linden|[Rr]epr|[Nn]eu|[Ss]onder|[Vv]olksausgabe|[Ll]imited|\\[.+\\]|\\[.+\\]|[023456789]{1,2}\\.\\s|[Aa]ktualisiert|[Nn]achdr|[Kk]ult|[Ee]xclusiv|[Kk]orrigiert|[Ss]tudien|[Dd]urchges)')\n",
    "    \n",
    "    if len(re.findall(pattern, desc)) > 0:\n",
    "        continue\n",
    "    \n",
    "    try:\n",
    "        num = int(desc.strip()[0])\n",
    "        if num > 1 and \"Tsd\" not in desc and \"Tausend\" not in desc and \"Taus\" not in desc and \"Ex\" not in desc and \"Exemplare\" not in desc and \"S.\" not in desc:\n",
    "            continue\n",
    "        try:\n",
    "            num1 = int(desc.strip()[1])\n",
    "            if num1 > 1 and \"Tsd\" not in desc and \"Tausend\" not in desc and \"Taus\" not in desc and \"Ex\" not in desc and \"Exemplare\" not in desc and \"S.\" not in desc:\n",
    "                continue\n",
    "        except:\n",
    "            pass\n",
    "\n",
    "    except:\n",
    "        pass\n",
    "\n",
    "    sifted_books.append(b)\n",
    "print('{} of {} German fiction books that were not translations were first editions'.format(len(sifted_books), count_fictions_minus_trl))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Deleting books from dead and canonical republished authors"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "filehandler = open('sifted_books.pkl', 'wb')\n",
    "pickle.dump(sifted_books, filehandler, pickle.HIGHEST_PROTOCOL)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "filehandler = open('sifted_books.pkl', 'rb')\n",
    "sifted_books = pickle.load(filehandler)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Remove all books published before 1500"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "no_low_dates = []\n",
    "\n",
    "for b in tqdm(sifted_books):\n",
    "\n",
    "    current_b = get_info(b)\n",
    "    \n",
    "    if current_b['date'] is not None:\n",
    "        if current_b['date'] >= 1500:\n",
    "            no_low_dates.append(b)\n",
    "\n",
    "print('{} of {} first edition German novels that were no translations are from 1500 or later'.format(len(no_low_dates), len(sifted_books)))\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Part 3: Delete duplicates\n",
    "\n",
    "Function to check whether authors or dates are the same:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def check_authors(a1, a2):\n",
    "\n",
    "    if a1 == None or a2 == None:\n",
    "        return False\n",
    "    \n",
    "    a1 = ''.join([x for x in a1 if x not in punctuation])\n",
    "    a2 = ''.join([x for x in a2 if x not in punctuation])\n",
    "    \n",
    "    a1_words = a1.split()\n",
    "    a2_words = a2.split()\n",
    "    \n",
    "    count = 0\n",
    "    for w in a2_words:\n",
    "        if w in a1_words:\n",
    "            count += 1\n",
    "            \n",
    "    if count >= 2:\n",
    "        return True\n",
    "    else:\n",
    "        return False\n",
    "    \n",
    "def check_dates(d1, d2):\n",
    "    if d1 == None and d2 != None:\n",
    "        return 'check'\n",
    "    elif d2 == None and d1 != None:\n",
    "        return 'current'\n",
    "    elif d1 == None and d2 == None:\n",
    "        return 'check'\n",
    "    elif d2 > d1:\n",
    "        return 'current'\n",
    "    else:\n",
    "        return 'check'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Remove if author and title are the same, keep earlier date:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(\"Duplikate entfernen...\")\n",
    "no_duplicates = []\n",
    "to_del = []\n",
    "current_title_without_sub = \"\"\n",
    "check_b_title_without_sub = \"\"\n",
    "infos = {}\n",
    "\n",
    "for b in tqdm(no_low_dates):\n",
    "\n",
    "    current_b = get_info(b)\n",
    "    current_title_without_sub = current_b['title'].rsplit('---', 1)[0]\n",
    "    no_append = False\n",
    "    #start = time.time()\n",
    "        \n",
    "    for i, n in enumerate(no_duplicates):\n",
    "        if not (i in infos):\n",
    "            infos[i] = get_info(n) ### ODER: hier war vorher ein Fehler, get_info(n) ist richtig!\n",
    "        \n",
    "        check_b = infos[i]\n",
    "        check_b_title_without_sub = check_b['title'].rsplit('---', 1)[0]\n",
    "        \n",
    "        if current_title_without_sub == check_b_title_without_sub:\n",
    "            same_author = check_authors(current_b['author'], check_b['author'])\n",
    "            if same_author == True:\n",
    "                date = check_dates(current_b['date'], check_b['date'])\n",
    "                if date == 'current':\n",
    "                    no_append = False\n",
    "                    to_del.append(i)\n",
    "                else:\n",
    "                    no_append = True\n",
    "                    break\n",
    "                    \n",
    "    if no_append == False:\n",
    "        no_duplicates.append(b)\n",
    "    \n",
    "for i in sorted(list(set(to_del)), reverse=True):\n",
    "    del no_duplicates[i]\n",
    "    \n",
    "print('{} of {} first edition German novels that were no translations are not duplicates'.format(len(no_duplicates), len(sifted_books)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "filehandler = open('no_duplicate.pkl', 'wb')\n",
    "pickle.dump(no_duplicates, filehandler, pickle.HIGHEST_PROTOCOL)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "filehandler = open('no_duplicate.pkl', 'rb')\n",
    "no_duplicates = pickle.load(filehandler)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('{} of {} total records (fictions minus translations) were kept'.format(len(no_duplicates), count_fictions_minus_trl))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for_csv = [get_info(x) for x in no_duplicates]\n",
    "\n",
    "import csv\n",
    "\n",
    "with open('using_data.csv', 'w', encoding='utf8') as output_file:\n",
    "    dict_writer = csv.DictWriter(output_file, delimiter=';', lineterminator='\\n', fieldnames=['PPN','author', 'title', 'subtitle', 'edition', 'date', 'genre', 'date', 'location', 'publishing-house', 'pages', 'genre-by-librarian', 'summary'])\n",
    "    dict_writer.writeheader()\n",
    "    dict_writer.writerows(for_csv)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Part 4: genre appearences\n",
    "\n",
    "This part looks for all appearences of the basic genre terms, no matter in which context (separete, with adj. or in compound words)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import glob\n",
    "import re\n",
    "from collections import Counter\n",
    "import pickle\n",
    "from collections import defaultdict\n",
    "from string import punctuation\n",
    "\n",
    "\n",
    "def roman_query2(text):\n",
    "    pattern = r'([Kk]rimi\\b|[Gg]em([^\\s]{1,2})lde|[Rr]oman|[Dd]ichtung|[Ee]rz([^\\s]{1,2})hlung|[Mm]([^\\s]{1,2})rchen|[Kk]om([^\\s]{1,2})die|[Tt]rag([^\\s]{1,2})die|[Hh]([^\\s]{1,2})rspiel|[Nn]ovelle|[Gg]eschichte|[Gg]edicht|[Ff]iktion|[Ll]egende|[Cc]ronik|[Ee]pos|[Ss]aga|[Hh]istorie|[Hh]istoria|[Bb]uch|[Ll]ied|[Ss]kizze|[Ss]zene|[Mm]ythos|[Ll]yrik|[Aa]ufzeichnung|[Ee]pisode|[Dd]arstellung|[Bb]iogra[fp]h?ie|[Dd]rama|[Bb]allade|[Bb]rief|[Ss]chauspiel|[Tr]rauerspiel|[Dd]ialog|[Mm]onolog|[Ee]inakter|[Ee]ssay|[Ff]abel|[Ff]arce|[Ff]euilleton|[Ff]ragment|[Gg]ebet|[Gg]leichnis|[Gg]roteske|[Ii]nterview|[Pp]oesie|[Dd]rama|[Pp]arabel|[Pp]arodie|[Rr]eportage|[Rr]obinsonade|[Ss]atire|[Ss]onett|[Uu]topie|[Bb]ericht|[Dd]okumentation|[Pp]rosa|[Ww]itz|[Ee]legie|[Hh]ymn|[Rr]omanze|[Aa]phorism|[Ee]pistel|[Ff]eature|[Ss]chrift|[Cc]armen\\s[Hh]eroicum|[Ee]pigramm|[Ee]kloge|[Ss]ylva|[Ll]yricum|Ode|[Bb]ild)'\n",
    "    # print(text, \"*****\", re.findall(pattern, text))\n",
    "    try:\n",
    "        text = text.replace(\"Orig. Roman\", \"Originalroman\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"ErzÃ¤hl.\", \"Erzählung\")  # wegen Abkürzungen\n",
    "    except:\n",
    "        pass\n",
    "\n",
    "    return re.findall(pattern, text)\n",
    "\n",
    "\n",
    "def clean_transition2(text):\n",
    "    try:\n",
    "        text = text[text.index('---') + 3:]\n",
    "\n",
    "    except:\n",
    "        pass\n",
    "\n",
    "    text = ''.join([x for x in text if x not in punctuation.replace('-', '')]).strip().strip('-').strip()\n",
    "\n",
    "    return text\n",
    "\n",
    "\n",
    "matches = []\n",
    "genre_appearences = []\n",
    "genre_appearences_year = {}\n",
    "genres_of_actual_title = []\n",
    "genre_appearences_year[\"no genre label at all\"] = {}\n",
    "genre_appearences_year[\"genre label at all\"] = {}\n",
    "\n",
    "for b in no_duplicates:\n",
    "    current_b = get_info(b)\n",
    "    current_b['title'] = current_b['title'].lower()\n",
    "    if 'subtitle' in current_b:\n",
    "        current_b['subtitle'] = current_b['subtitle'].lower()\n",
    "\n",
    "    if 'title' and 'subtitle' in current_b:\n",
    "        matches = roman_query2(current_b['title'] + ' ' + current_b['subtitle'])\n",
    "    elif 'title' in current_b:\n",
    "        matches = roman_query2(current_b['title'])\n",
    "    elif 'subtitle' in current_b:\n",
    "        matches = roman_query2(current_b['subtitle'])\n",
    "    else:\n",
    "        pass\n",
    "\n",
    "        # creating a dictionary that contains counts per year for every RegEx genre match\n",
    "    if len(matches) > 0:\n",
    "        genres_of_actual_title = []\n",
    "        for counter, i in enumerate(matches):\n",
    "            m = matches[counter]\n",
    "            actual = clean_transition2(m[0])\n",
    "            if actual not in genres_of_actual_title:\n",
    "                genres_of_actual_title.append(actual)\n",
    "                genre_appearences.append(actual)\n",
    "                if actual not in genre_appearences_year:\n",
    "                    genre_appearences_year[actual] = {}\n",
    "                try:\n",
    "                    genre_appearences_year[actual][current_b['date']] += 1\n",
    "                except:\n",
    "                    genre_appearences_year[actual][current_b['date']] = 1\n",
    "            else:\n",
    "                pass\n",
    "\n",
    "        # zählen der Titel mit Genrelabel\n",
    "        genre_appearences.append(\"genre label at all\")\n",
    "        try:\n",
    "            genre_appearences_year[\"genre label at all\"][current_b['date']] += 1\n",
    "        except:\n",
    "            genre_appearences_year[\"genre label at all\"][current_b['date']] = 1\n",
    "\n",
    "    else:  # zählen der Titel ohne genre label\n",
    "        genre_appearences.append(\"no genre label at all\")\n",
    "        try:\n",
    "            genre_appearences_year[\"no genre label at all\"][current_b['date']] += 1\n",
    "        except:\n",
    "            genre_appearences_year[\"no genre label at all\"][current_b['date']] = 1\n",
    "\n",
    "print()\n",
    "print()\n",
    "print(\"RegEx one-word genre appearences:\")\n",
    "print(Counter(genre_appearences).most_common()[:100])\n",
    "print()\n",
    "print(\"RegEx one-word genre appearences per year:\")\n",
    "print(genre_appearences_year)\n",
    "\n",
    "pickle.dump((genre_appearences, genre_appearences_year),\n",
    "            open('regex_genre_appearences.pkl', 'wb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Part 5: Single word matches\n",
    "\n",
    "This part only looks for single word (one-word) matches such as \"Roman\" or \"Geschichte\", no compound words, not something consisting of two words."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import glob\n",
    "import re\n",
    "from collections import Counter\n",
    "import pickle\n",
    "from collections import defaultdict\n",
    "from string import punctuation\n",
    "\n",
    "\n",
    "def roman_query1(text):\n",
    "    try:\n",
    "        text = text.replace(\"[\", \" \")\n",
    "        text = text.replace(\"Orig. Roman\", \"Originalroman\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"ErzÃ¤hl.\", \"Erzählung\")  # wegen Abkürzungen\n",
    "    except:\n",
    "        pass\n",
    "    # aktuell nur Singularmatches durch \\b am Ende\n",
    "    pattern = r'((^|[\\s]+)([Kk]rimi\\b|[Gg]em([^\\s]{1,2})lde|[R]oman|[Dd]ichtung|[Ee]rz([^\\s]{1,2})hlung|[Mm]([^\\s]{1,2})rchen|[Kk]om([^\\s]{1,2})die|[Tt]rag([^\\s]{1,2})die|[Hh]([^\\s]{1,2})rspiel|[Nn]ovelle|[Gg]eschichte|[Gg]edicht|[Ff]iktion|[Ll]egende|[Cc]ronik|[Ee]pos|[Ss]aga|[Hh]istorie|[Hh]istoria|[Bb]uch|[Ll]ied|[Ss]kizze|[Ss]zene|[Mm]ythos|[Ll]yrik|[Aa]ufzeichnung|[Ee]pisode|[Dd]arstellung|[Bb]iogra[fp]h?ie|[Dd]rama|[Bb]allade|[Bb]rief|[Ss]chauspiel|[Tr]rauerspiel|[Dd]ialog|[Mm]onolog|[Ee]inakter|[Ee]ssay|[Ff]abel|[Ff]arce|[Ff]euilleton|[Ff]ragment|[Gg]ebet|[Gg]leichnis|[Gg]roteske|[Ii]nterview|[Pp]oesie|[Dd]rama|[Pp]arabel|[Pp]arodie|[Rr]eportage|[Rr]obinsonade|[Ss]atire|[Ss]onett|[Uu]topie|[Bb]ericht|[Dd]okumentation|[Pp]rosa|[Ww]itz|[Ee]legie|[Hh]ymn|[Rr]omanze|[Aa]phorism|[Ee]pistel|[Ff]eature|[Ss]chrift|[Cc]armen\\s[Hh]eroicum|[Ee]pigramm|[Ee]kloge|[Ss]ylva|[Ll]yricum|Ode|[Bb]ild)(\\b))'\n",
    "    # pattern_Wortgrenze = r'([R]oman\\b|[D]ichtung\\b|[E]rz([^\\s]+)hlung\\b|[M]([^\\s]+)rchen\\b|[K]om([^\\s]+)die\\b|[T]rag([^\\s]+)die\\b|[H]([^\\s]+)rspiel\\b|[N]ovelle\\b|[G]eschichte\\b|[G]edicht\\b|[F]iktion\\b|[L]egende\\b|[C]ronik\\b|[S]age\\b|[E]pos\\b|[H]istorie\\b|[H]istoria\\b|[B]uch\\b|[W]erk\\b|[L]ied\\b|[S]kizze\\b|[S]zene\\b|[Mm]ythos\\b|[L]yrik\\b|[A]ufzeichnung\\b|[E]pisode\\b|[D]arstellung\\b|[B]iogra[fp]h?ie\\b|[D]rama\\b|[B]allade\\b|[B]rief\\b|[T]rauerspiel\\b|[D]ialog\\b|[M]onolog\\b|[E]inakter\\b|[E]ssay\\b|[F]abel\\b|[L]iteratur\\b|[F]arce\\b|[F]euilleton\\b|[F]ragment\\b|[G]ebet\\b|[G]leichnis\\b|[G]roteske\\b|[I]nterview\\b|[P]oesie\\b|[D]rama\\b|[F]iktion\\b|[P]arabel\\b|[P]arodie\\b|[R]eportage\\b|[R]obinsonade\\b|[S]atire\\b|[S]onett\\b|[U]topie\\b|[B]ericht\\b|[D]okumentation\\b|[P]rosa\\b|[W]itz\\b|[E]legie\\b|[H]ymne\\b|[R]omanze\\b|[A]phorismus\\b|[E]pistel\\b|[F]eature\\b|[S]chrift\\b)'\n",
    "    # print(text, \"*****\", re.findall(pattern, text))\n",
    "    return re.findall(pattern, text)\n",
    "\n",
    "\n",
    "def clean_transition1(text):\n",
    "    try:\n",
    "        text = text[text.index('---') + 3:]\n",
    "\n",
    "    except:\n",
    "        pass\n",
    "\n",
    "    text = ''.join([x for x in text if x not in punctuation.replace('-', '')]).strip().strip('-').strip()\n",
    "\n",
    "    return text\n",
    "\n",
    "\n",
    "matches = []\n",
    "single_genres = []\n",
    "single_matches_year = {}\n",
    "genres_of_actual_title = []\n",
    "\n",
    "for b in no_duplicates:\n",
    "    current_b = get_info(b)\n",
    "    current_b['title'] = current_b['title'].lower()\n",
    "    if 'subtitle' in current_b:\n",
    "        current_b['subtitle'] = current_b['subtitle'].lower()\n",
    "\n",
    "    if 'title' and 'subtitle' in current_b:\n",
    "        matches = roman_query1(current_b['title'] + ' ' + current_b['subtitle'])\n",
    "    elif 'title' in current_b:\n",
    "        matches = roman_query1(current_b['title'])\n",
    "    elif 'subtitle' in current_b:\n",
    "        matches = roman_query1(current_b['subtitle'])\n",
    "    else:\n",
    "        pass\n",
    "\n",
    "        # creating a dictionary that contains counts per year for every RegEx genre match\n",
    "    if len(matches) > 0:\n",
    "        genres_of_actual_title = []\n",
    "        for counter, i in enumerate(matches):\n",
    "            m = matches[counter]\n",
    "            actual = clean_transition1(m[0])\n",
    "            if actual not in genres_of_actual_title:\n",
    "                genres_of_actual_title.append(actual)\n",
    "                single_genres.append(actual)\n",
    "                if actual not in single_matches_year:\n",
    "                    single_matches_year[actual] = {}\n",
    "                try:\n",
    "                    single_matches_year[actual][current_b['date']] += 1\n",
    "                except:\n",
    "                    single_matches_year[actual][current_b['date']] = 1\n",
    "            else:\n",
    "                pass\n",
    "\n",
    "print()\n",
    "print()\n",
    "print(\"RegEx one-word single matches:\")\n",
    "print(Counter(single_genres).most_common()[:100])\n",
    "print()\n",
    "print(\"RegEx one-word single matches per year:\")\n",
    "print(single_matches_year)\n",
    "\n",
    "pickle.dump((single_genres, single_matches_year),\n",
    "            open('regex_single_genres.pkl', 'wb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Part 6: Compound word matches\n",
    "\n",
    "This part only looks for compound word (one-word) matches such as \"Liebesgeschichte\", not \"neue Geschichte\" or something consisting of two words (part 2)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import glob\n",
    "import re\n",
    "from collections import Counter\n",
    "import pickle\n",
    "from collections import defaultdict\n",
    "from string import punctuation\n",
    "\n",
    "\n",
    "def roman_query(text):\n",
    "    pattern = r'([^\\s]+)([Kk]rimi\\b|[Gg]em([^\\s]{1,2})lde|[Rr]oman|[Dd]ichtung|[Ee]rz([^\\s]{1,2})hlung|[Mm]([^\\s]{1,2})rchen|[Kk]om([^\\s]{1,2})die|[Tt]rag([^\\s]{1,2})die|[Hh]([^\\s]{1,2})rspiel|[Nn]ovelle|[Gg]eschichte|[Gg]edicht|[Ff]iktion|[Ll]egende|[Cc]ronik|[Ee]pos|[Ss]aga|[Hh]istorie|[Hh]istoria|[Bb]uch|[Ll]ied|[Ss]kizze|[Ss]zene|[Mm]ythos|[Ll]yrik|[Aa]ufzeichnung|[Ee]pisode|[Dd]arstellung|[Bb]iogra[fp]h?ie|[Dd]rama|[Bb]allade|[Bb]rief|[Ss]chauspiel|[Tr]rauerspiel|[Dd]ialog|[Mm]onolog|[Ee]inakter|[Ee]ssay|[Ff]abel|[Ff]arce|[Ff]euilleton|[Ff]ragment|[Gg]ebet|[Gg]leichnis|[Gg]roteske|[Ii]nterview|[Pp]oesie|[Dd]rama|[Pp]arabel|[Pp]arodie|[Rr]eportage|[Rr]obinsonade|[Ss]atire|[Ss]onett|[Uu]topie|[Bb]ericht|[Dd]okumentation|[Pp]rosa|[Ww]itz|[Ee]legie|[Hh]ymn|[Rr]omanze|[Aa]phorism|[Ee]pistel|[Ff]eature|[Ss]chrift|[Cc]armen\\s[Hh]eroicum|[Ee]pigramm|[Ee]kloge|[Ss]ylva|[Ll]yricum|Ode|[Bb]ild)'\n",
    "\n",
    "    try:\n",
    "        text = text.replace(\"---\", \" \")\n",
    "        text = text.replace(\"hist.\", \"historischer\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"Hist.\", \"Historischer\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"histor.\", \"historischer\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"Histor.\", \"historischer\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"historisch.\", \"historischer\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"Historisch.\", \"historischer\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"historisch romantisch\", \"historisch-romantisch\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"Historisch romantisch\", \"historisch-romantisch\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"histor romant.\", \"historisch-romantisch\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"Histor romant.\", \"historisch-romantisch\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"Histor Roman\", \"historischer Roman\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"histor Roman\", \"historischer Roman\")  # wegen Abkürzungen\n",
    "\n",
    "        text = text.replace(\"Orig. Roman\", \"Originalroman\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"ErzÃ¤hl.\", \"Erzählung\")  # wegen Abkürzungen\n",
    "    except:\n",
    "        pass\n",
    "    # print(text, \"*****\", re.findall(pattern, text))\n",
    "    return re.findall(pattern, text)\n",
    "\n",
    "\n",
    "def clean_transition(text):\n",
    "    try:\n",
    "        text = text[text.index('---') + 3:]\n",
    "\n",
    "    except:\n",
    "        pass\n",
    "    text = ''.join([x for x in text if x not in punctuation.replace('-', '')]).strip().strip('-').strip()\n",
    "    return text\n",
    "\n",
    "\n",
    "matches = []\n",
    "genre_matches = []\n",
    "genre_terms = []\n",
    "genre_types = []\n",
    "year_counts = {'1700': 1, '1701': 2}\n",
    "genre_matches_year = {}\n",
    "genre_matches_year_category = {}\n",
    "\n",
    "for b in no_duplicates:\n",
    "    current_b = get_info(b)\n",
    "    current_b['title'] = current_b['title'].lower()\n",
    "    if 'subtitle' in current_b:\n",
    "        current_b['subtitle'] = current_b['subtitle'].lower()\n",
    "\n",
    "    if 'title' and 'subtitle' in current_b:\n",
    "        matches = roman_query(current_b['title'] + ' ' + current_b['subtitle'])\n",
    "    elif 'title' in current_b:\n",
    "        matches = roman_query(current_b['title'])\n",
    "    elif 'subtitle' in current_b:\n",
    "        matches = roman_query(current_b['subtitle'])\n",
    "    else:\n",
    "        pass\n",
    "\n",
    "        # creating a dictionary that contains counts per year for every RegEx genre match\n",
    "    if len(matches) > 0:\n",
    "        m = matches[-1]\n",
    "        if not m[0].endswith('---'):\n",
    "            preamble = clean_transition(m[0])\n",
    "            if len(preamble) > 0:\n",
    "                genre_terms.append(preamble)\n",
    "                genre_matches.append(preamble + m[1])\n",
    "                genre_types.append(m[1])\n",
    "\n",
    "                if preamble + m[1] not in genre_matches_year:\n",
    "                    genre_matches_year[preamble + m[1]] = {}\n",
    "                if m[1] not in genre_matches_year_category:\n",
    "                    genre_matches_year_category[m[1]] = {}\n",
    "\n",
    "                try:\n",
    "                    genre_matches_year[preamble + m[1]][current_b['date']] += 1\n",
    "                except:\n",
    "                    genre_matches_year[preamble + m[1]][current_b['date']] = 1\n",
    "\n",
    "                try:\n",
    "                    genre_matches_year_category[m[1]][current_b['date']] += 1\n",
    "                except:\n",
    "                    genre_matches_year_category[m[1]][current_b['date']] = 1\n",
    "\n",
    "print(\"RegEx one-word full matches:\")\n",
    "print(Counter(genre_matches).most_common()[:100])\n",
    "print()\n",
    "print(\"RegEx one-word first part matches:\")\n",
    "print(Counter(genre_terms).most_common()[:100])\n",
    "print()\n",
    "print(\"RegEx one-word second part (genre) matches:\")\n",
    "print(Counter(genre_types).most_common()[:100])\n",
    "print()\n",
    "print(\"=\" * 10)\n",
    "print()\n",
    "print(\"RegEx one-word full matches per year:\")\n",
    "print(genre_matches_year)\n",
    "print()\n",
    "print(\"=\" * 10)\n",
    "print()\n",
    "print(\"RegEx one-word second part (genre) matches:\")\n",
    "print(genre_matches_year_category)\n",
    "\n",
    "pickle.dump((genre_matches, genre_terms, genre_types, genre_matches_year_category),\n",
    "            open('regex_compound_words.pkl', 'wb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Part 7: Two word adjective + noun genre matches\n",
    "\n",
    "This section only looks at the adjective + noun combinations for genre descriptions."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "import glob\n",
    "import re\n",
    "from collections import Counter\n",
    "import spacy\n",
    "\n",
    "nlp = spacy.load('de_core_news_sm')\n",
    "pattern = r'^([Kk]rimi(\\b)|[Gg]em([^\\s]{1,2})lde|[R]oman|[Dd]ichtung|[Ee]rz([^\\s]{1,2})hlung|[Mm]([^\\s]{1,2})rchen|[Kk]om([^\\s]{1,2})die|[Tt]rag([^\\s]{1,2})die|[Hh]([^\\s]{1,2})rspiel|[Nn]ovelle|[Gg]eschichte|[Gg]edicht|[Ff]iktion|[Ll]egende|[Cc]ronik|[Ee]pos|[Ss]aga|[Hh]istorie|[Hh]istoria|[Bb]uch|[Ll]ied|[Ss]kizze|[Ss]zene|[Mm]ythos|[Ll]yrik|[Aa]ufzeichnung|[Ee]pisode|[Dd]arstellung|[Bb]iogra[fp]h?ie|[Dd]rama|[Bb]allade|[Bb]rief|[Ss]chauspiel|[Tr]rauerspiel|[Dd]ialog|[Mm]onolog|[Ee]inakter|[Ee]ssay|[Ff]abel|[Ff]arce|[Ff]euilleton|[Ff]ragment|[Gg]ebet|[Gg]leichnis|[Gg]roteske|[Ii]nterview|[Pp]oesie|[Dd]rama|[Pp]arabel|[Pp]arodie|[Rr]eportage|[Rr]obinsonade|[Ss]atire|[Ss]onett|[Uu]topie|[Bb]ericht|[Dd]okumentation|[Pp]rosa|[Ww]itz|[Ee]legie|[Hh]ymn|[Rr]omanze|[Aa]phorism|[Ee]pistel|[Ff]eature|[Ss]chrift|[Cc]armen\\s[Hh]eroicum|[Ee]pigramm|[Ee]kloge|[Ss]ylva|[Ll]yricum|Ode|[Bb]ild)'\n",
    "\n",
    "\n",
    "def find_genre_adjectives(text):\n",
    "    try:\n",
    "        # text = text.lower()\n",
    "        text = text.replace(\"---\", \" - \")\n",
    "        text = text.replace(\"hist.\", \"historischer\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"Hist.\", \"Historischer\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"histor.\", \"historischer\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"Histor.\", \"historischer\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"historisch.\", \"historischer\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"Historisch.\", \"historischer\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"historisch romantisch\", \"historisch-romantisch\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"Historisch romantisch\", \"historisch-romantisch\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"histor romant.\", \"historisch-romantisch\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"Histor romant.\", \"historisch-romantisch\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"Histor Roman\", \"historischer Roman\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"histor Roman\", \"historischer Roman\")  # wegen Abkürzungen\n",
    "\n",
    "        text = text.replace(\"Orig. Roman\", \"Originalroman\")  # wegen Abkürzungen\n",
    "        text = text.replace(\"ErzÃ¤hl.\", \"Erzählung\")  # wegen Abkürzungen\n",
    "\n",
    "\n",
    "\n",
    "    except:\n",
    "        pass\n",
    "\n",
    "    parsed_text = nlp(text)\n",
    "\n",
    "    phrases = []\n",
    "    adj = ''\n",
    "    ind = 0\n",
    "    for i, t in enumerate(parsed_text):\n",
    "        # print(parsed_text)\n",
    "        if t.pos_ == 'ADJ':\n",
    "            adj = t.text\n",
    "            ind = i\n",
    "        if re.search(pattern, t.text) != None and i - ind == 1 and len(adj) > 1 and str.lower(adj) != \"novelle\":\n",
    "            phrases.append(adj + ' ' + t.text)\n",
    "    # print(phrases)\n",
    "    return phrases\n",
    "\n",
    "\n",
    "def remove_duplicates(values):\n",
    "    items = []\n",
    "    for item in values:\n",
    "        items.append(make_unique(clean_transition(item.lower())))\n",
    "    return items\n",
    "\n",
    "\n",
    "def make_unique(text):\n",
    "    items = text.split()\n",
    "    if len(items) > 1 and items[0] == items[1]:\n",
    "        return items[0]\n",
    "    else:\n",
    "        return text\n",
    "\n",
    "\n",
    "all_phrases = []\n",
    "phrases_p_year = {}\n",
    "phrases_category_year = {}\n",
    "\n",
    "for b in no_duplicates:\n",
    "    current_b = get_info(b)\n",
    "\n",
    "    if 'title' and 'subtitle' in current_b:\n",
    "        matches = find_genre_adjectives(current_b['title'] + ' ' + current_b['subtitle'])\n",
    "    elif 'title' in current_b:\n",
    "        matches = find_genre_adjectives(current_b['title'])\n",
    "    elif 'subtitle' in current_b:\n",
    "        matches = find_genre_adjectives(current_b['subtitle'])\n",
    "    else:\n",
    "        pass\n",
    "\n",
    "    if len(matches) > 0:\n",
    "        matches_clean = list(set(remove_duplicates(matches)))\n",
    "        all_phrases.append(matches_clean)\n",
    "\n",
    "        for m in matches_clean:\n",
    "            if len(m) > 4:\n",
    "\n",
    "                if clean_transition(m) not in phrases_p_year:\n",
    "                    phrases_p_year[clean_transition(m)] = {}\n",
    "                if clean_transition(m).split()[-1] not in phrases_category_year:\n",
    "                    phrases_category_year[clean_transition(m).split()[-1]] = {}\n",
    "\n",
    "                try:\n",
    "                    phrases_p_year[clean_transition(m)][current_b['date']] += 1\n",
    "                except:\n",
    "                    phrases_p_year[clean_transition(m)][current_b['date']] = 1\n",
    "\n",
    "                try:\n",
    "                    phrases_category_year[clean_transition(m).split()[-1]][current_b['date']] += 1\n",
    "                except:\n",
    "                    phrases_category_year[clean_transition(m).split()[-1]][current_b['date']] = 1\n",
    "\n",
    "# flat list\n",
    "all_phrases_flat = []\n",
    "for sublist in all_phrases:\n",
    "    for item in sublist:\n",
    "        all_phrases_flat.append(clean_transition(item))\n",
    "\n",
    "adjectives = [x.split()[0] for x in all_phrases_flat]\n",
    "\n",
    "print(\"Most common Adjective + Target Noun Combinations:\")\n",
    "print(Counter(all_phrases_flat).most_common()[:100])\n",
    "print()\n",
    "print(\"Most common adjectives:\")\n",
    "print(Counter(adjectives).most_common())\n",
    "print()\n",
    "print(\"Adjective + Target Noun Combinations per year:\")\n",
    "print(phrases_p_year)\n",
    "print()\n",
    "print(\"Only target noun counts per year (category):\")\n",
    "print(phrases_category_year)\n",
    "\n",
    "pickle.dump((all_phrases_flat, adjectives, phrases_p_year, phrases_category_year), open('spacy_adj_noun.pkl', 'wb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Part 8: Combine RegEx and two word phrases\n",
    "\n",
    "Make dictionary with full matches:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import copy\n",
    "\n",
    "combined_full = {}\n",
    "for k in genre_matches_year.keys():\n",
    "    combined_full[k] = copy.deepcopy(genre_matches_year[k])\n",
    "\n",
    "for k in phrases_p_year.keys():\n",
    "    if k in combined_full:\n",
    "        pass\n",
    "    else:\n",
    "        combined_full[k] = copy.deepcopy(phrases_p_year[k])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Make dictionary with only base category type:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "combined_category = {}\n",
    "for k in genre_matches_year_category.keys():\n",
    "    combined_category[k] = copy.deepcopy(genre_matches_year_category[k])\n",
    "\n",
    "for k in phrases_p_year.keys():\n",
    "    if k in combined_category:\n",
    "        pass\n",
    "    else:\n",
    "        genre = k.split()[-1]\n",
    "        try:\n",
    "            for y in phrases_p_year[k].keys():\n",
    "                if y in combined_category[genre]:\n",
    "                    combined_category[genre][y] += phrases_p_year[k][y]\n",
    "                else:\n",
    "                    combined_category[genre][y] = copy.deepcopy(phrases_p_year[k][y])\n",
    "                    \n",
    "        except:\n",
    "            combined_category[genre] = copy.deepcopy(phrases_p_year[k])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Writing 6 csv-files:\n",
    "1. List of RegEx full one-word matches per year.\n",
    "2. List of Adjective + Target Noun full combinations per year.\n",
    "3. List of RegEx second part (category genre) one-word matches per year.\n",
    "4. List of Adjective + Noun combo but only second part (category genre) per year.\n",
    "5. Combined full matches per year.\n",
    "6. Combined category genre only per year."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import csv\n",
    "import itertools\n",
    "import sys\n",
    "import json\n",
    "\n",
    "### Tabellenkopf\n",
    "jahre = itertools.chain(range(1500,2021))\n",
    "nummern = []\n",
    "for x in jahre:\n",
    "    nummern.append(str(x))\n",
    "fields1 = ['Genrebegriff', 'null']\n",
    "fields = fields1 + nummern\n",
    "\n",
    "# 1st file\n",
    "# turning keys into strings\n",
    "genre_matches_year_str = json.loads(json.dumps(genre_matches_year))\n",
    "\n",
    "\n",
    "with open(\"full_genre_matches_year.csv\", \"w\", newline='', encoding='utf8') as f:\n",
    "    w = csv.DictWriter(f, fields, delimiter=';', lineterminator='\\n')\n",
    "    w.writeheader()\n",
    "    \n",
    "    for k in genre_matches_year_str:\n",
    "        genre_matches_year_str[k][\"Genrebegriff\"] = str(k)\n",
    "        w.writerow({field: genre_matches_year_str[k].get(field) or 'None' for field in fields})\n",
    "\n",
    "\n",
    "# 2nd file\n",
    "phrases_p_year_str = json.loads(json.dumps(phrases_p_year))\n",
    "\n",
    "with open(\"full_phrases_p_year.csv\", \"w\", newline='', encoding='utf8') as f:\n",
    "    w = csv.DictWriter(f, fields, delimiter=';', lineterminator='\\n')\n",
    "    w.writeheader()\n",
    "    \n",
    "    for k in phrases_p_year_str:\n",
    "        phrases_p_year_str[k][\"Genrebegriff\"] = str(k)\n",
    "        w.writerow({field: phrases_p_year_str[k].get(field) or 'None' for field in fields})\n",
    "        \n",
    "# 3rd file\n",
    "genre_matches_year_category = json.loads(json.dumps(genre_matches_year_category))\n",
    "\n",
    "with open(\"category_genre_year.csv\", \"w\", newline='', encoding='utf8') as f:\n",
    "    w = csv.DictWriter(f, fields, delimiter=';', lineterminator='\\n')\n",
    "    w.writeheader()\n",
    "    \n",
    "    for k in genre_matches_year_category:\n",
    "        genre_matches_year_category[k][\"Genrebegriff\"] = str(k)\n",
    "        w.writerow({field: genre_matches_year_category[k].get(field) or 'None' for field in fields})\n",
    "        \n",
    "# 4th file\n",
    "phrases_category_year = json.loads(json.dumps(phrases_category_year))\n",
    "\n",
    "with open(\"category_phrases_year.csv\", \"w\", newline='', encoding='utf8') as f:\n",
    "    w = csv.DictWriter(f, fields, delimiter=';', lineterminator='\\n')\n",
    "    w.writeheader()\n",
    "    \n",
    "    for k in phrases_category_year:\n",
    "        phrases_category_year[k][\"Genrebegriff\"] = str(k)\n",
    "        w.writerow({field: phrases_category_year[k].get(field) or 'None' for field in fields})\n",
    "        \n",
    "# 5th file\n",
    "combined_full_year = json.loads(json.dumps(combined_full))\n",
    "\n",
    "with open(\"combined_full_year.csv\", \"w\", newline='', encoding='utf8') as f:\n",
    "    w = csv.DictWriter(f, fields, delimiter=';', lineterminator='\\n')\n",
    "    w.writeheader()\n",
    "    \n",
    "    for k in combined_full_year:\n",
    "        combined_full_year[k][\"Genrebegriff\"] = str(k)\n",
    "        w.writerow({field: combined_full_year[k].get(field) or 'None' for field in fields})\n",
    "        \n",
    "# 6th file\n",
    "combined_category_year = json.loads(json.dumps(combined_category))\n",
    "\n",
    "with open(\"combined_category_year.csv\", \"w\", newline='', encoding='utf8') as f:\n",
    "    w = csv.DictWriter(f, fields, delimiter=';', lineterminator='\\n')\n",
    "    w.writeheader()\n",
    "    \n",
    "    for k in combined_category_year:\n",
    "        combined_category_year[k][\"Genrebegriff\"] = str(k)\n",
    "        w.writerow({field: combined_category_year[k].get(field) or 'None' for field in fields})\n",
    "\n",
    "# 7th file\n",
    "single_matches_year_str = json.loads(json.dumps(single_matches_year))\n",
    "\n",
    "with open(\"single_genre_terms.csv\", \"w\", newline='', encoding='utf8') as f:\n",
    "    w = csv.DictWriter(f, fields, delimiter=';', lineterminator='\\n')\n",
    "    w.writeheader()\n",
    "    \n",
    "    for k in single_matches_year_str:\n",
    "        single_matches_year_str[k][\"Genrebegriff\"] = str(k)\n",
    "        w.writerow({field: single_matches_year_str[k].get(field) or 'None' for field in fields})\n",
    "\n",
    "# 8th file\n",
    "genre_appearences_year_str = json.loads(json.dumps(genre_appearences_year))\n",
    "\n",
    "with open(\"genre_appearences.csv\", \"w\", newline='', encoding='utf8') as f:\n",
    "    w = csv.DictWriter(f, fields, delimiter=';', lineterminator='\\n')\n",
    "    w.writeheader()\n",
    "    \n",
    "    for k in genre_appearences_year_str:\n",
    "        genre_appearences_year_str[k][\"Genrebegriff\"] = str(k)\n",
    "        w.writerow({field: genre_appearences_year_str[k].get(field) or 'None' for field in fields})\n"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
